2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)

10. 灾后重建

Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近,一次严重的地震毁坏了全部M条道路。
震后,Pear打算修复其中一些道路,修理第i条道路需要Pi的时间。不过,Pear并不打算让全部的点连通,而是选择一些标号特殊的点让他们连通。
Pear有Q(<=50000)次询问,每次询问,他会选择所有编号在[l,r]之间,并且 编号 mod K = C 的点,修理一些路使得它们连通。由于所有道路的修理可以同时开工,所以完成修理的时间取决于花费时间最长的一条路,即涉及到的道路中Pi的最大值。

你能帮助Pear计算出每次询问时需要花费的最少时间么?这里询问是独立的,也就是上一个询问里的修理计划并没有付诸行动。

【输入格式】
第一行三个正整数N、M、Q,含义如题面所述。
接下来M行,每行三个正整数Xi、Yi、Pi,表示一条连接Xi和Yi的双向道路,修复需要Pi的时间。可能有自环,可能有重边。1<=Pi<=1000000。
接下来Q行,每行四个正整数Li、Ri、Ki、Ci,表示这次询问的点是[Li,Ri]区间中所有编号Mod Ki=Ci的点。保证参与询问的点至少有两个。

【输出格式】
输出Q行,每行一个正整数表示对应询问的答案。

【样例输入】
7 10 4
1 3 10
2 6 9
4 1 5
3 7 4
3 6 9
1 5 8
2 7 4
3 2 10
1 7 6
7 6 9
1 7 1 0
1 7 3 1
2 5 1 0
3 7 2 1

【样例输出】
9
6
8
8

【数据范围】
对于20%的数据,N,M,Q<=30
对于40%的数据,N,M,Q<=2000
对于100%的数据,N<=50000,M<=2*10^5,Q<=50000. Pi<=10^6.
Li,Ri,Ki均在[1,N]范围内,Ci在[0,对应询问的Ki)范围内。

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 5000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。

这题比较复杂,我们需要分析一下。

首先,每次询问其实都是给出一个特定点集,要求最小化把这些点连通的边权的最大值。
那么,该问题是MST问题的变体 最小生成树资料
进一步地,对于每次询问,最佳方案的边都在原图的最小生成树中,可由反证法证得。
因此,算法的第一部分就是抛弃原图,只留下最小生成树,边数减少到 n − 1 n-1 n1,并且有很多好用的特征。

任选一点使之成为有根树,树上任意两点有且仅有一条简单路径,也即两点分别向上连到LCA 最近公共祖先资料
再考虑,点1点3路径的最大值,其实已包含在点1点2路径和点2点3路径,可以对LCA分类讨论证得。
因此,对于特定点集并不需要两两求LCA,只需要对“相邻”点顺序求过去就行,复杂度由平方降为线性。
原图MST不会变动,可以采用倍增预处理的方法作为算法的第二部分。

本题所取点集与除法取模有关,可以考虑 Big Small 分界,【待补完】 线段树资料

本题从 Big Small 分界出发,但其实到最后并不需要 Big Small 分界,直接建简化线段树的复杂度是没有问题的,也真是有趣。考虑最极端情况,每次询问的 ( k , c ) (k,c) (k,c)均不同,每次都需要重新建树,因为 k k k越小点集越大,且对于每个 k k k c c c各有 k k k种取值,因此建树的总复杂度上限为
T ( n ) = n 1 log ⁡ n 1 + ( n 2 log ⁡ n 2 ) × 2 + ( n 3 log ⁡ n 3 ) × 3 + … T(n) = \frac{n}{1}\log \frac{n}{1} + (\frac{n}{2}\log \frac{n}{2}) \times 2 + (\frac{n}{3}\log \frac{n}{3}) \times 3 + \dots T(n)=1nlog1n+(2nlog2n)×2+(3nlog3n)×3+
= n log ⁡ n 1 + n log ⁡ n 2 + n log ⁡ n 3 + … = n \log \frac{n}{1} + n \log \frac{n}{2} + n \log \frac{n}{3} + \dots =nlog1n+nlog2n+nlog3n+
= Θ ( n ⋅ n ⋅ log ⁡ n ) = \Theta(\sqrt{n} \cdot n \cdot \log n) =Θ(n nlogn)

查询的总复杂度显然是 Θ ( q ⋅ log ⁡ n ) \Theta(q \cdot \log n) Θ(qlogn),两部分都完全没毛病。

不过在线练习系统只给了1s的时限就比较紧,这就必须得套个读入优化才能保证每次都过了,读入量接近百万级(20w*3+5w*4)。

#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;
const int N = 50010;
const int M = 200010;
const int FN = 16;
vector<PII> G[N];
int dep[N], ans[N];
int fa[N][FN], val[N][FN];
struct Que {int x, l, r, k, c;
} que[N];
bool debug = false;inline void getmax(int& x, int y)
{if (y > x)x = y;
}namespace Kruskal {
int p[N], ra[N];
struct Edge {int u, v, w;
} eg[M];int cmp(const Edge& p1, const Edge& p2) { return p1.w < p2.w; }int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }int merge(int x, int y)
{x = find(x);y = find(y);if (x == y)return 0;if (ra[x] > ra[y]) {p[y] = x;} else {if (ra[x] == ra[y])ra[y]++;p[x] = y;}return 1;
}void build(int kn, int km)
{int cnt = 0;for (int i = 1; i <= kn; i++) {p[i] = i;ra[i] = 0;}sort(eg + 1, eg + km + 1, cmp);for (int i = 1; i <= km; i++) {if (merge(eg[i].u, eg[i].v)) {G[eg[i].u].push_back(PII(eg[i].v, eg[i].w));G[eg[i].v].push_back(PII(eg[i].u, eg[i].w));if (++cnt == kn - 1)break;}}
}
} // namespace Kruskalclass SegTree {
#define lson rt << 1, l, m
#define rson rt << 1 | 1, m + 1, r
public:int key[N << 2];void build(int a[], int rt, int l, int r){if (l == r) {key[rt] = a[l];return;}int m = (l + r) >> 1;build(a, lson);build(a, rson);push_up(rt);}int query(int rt, int l, int r, int L, int R){if (L <= l && r <= R) {return key[rt];}int m = (l + r) >> 1;int res = 0;if (L <= m)getmax(res, query(lson, L, R));if (m < R)getmax(res, query(rson, L, R));return res;}private:inline void push_up(int rt){key[rt] = max(key[rt << 1], key[rt << 1 | 1]);}
#undef lson
#undef rson
};
SegTree T;void dfs(int u, int x)
{for (size_t i = 0; i < G[u].size(); i++) {int v = G[u][i].first;int w = G[u][i].second;if (v != x) {dep[v] = dep[u] + 1;fa[v][0] = u;val[v][0] = w;dfs(v, u);}}
}bool cmpkc(const Que& p, const Que& q)
{return p.k < q.k || (p.k == q.k && p.c < q.c);
}int query(int x, int y)
{if (x == 0)return 0;if (dep[x] > dep[y])swap(x, y);int res = 0, di = dep[y] - dep[x];for (int k = 0; k < FN; k++) {if ((di >> k) & 1) {getmax(res, val[y][k]);y = fa[y][k];}}int k = FN - 1;while (x != y) {while (k > 0 && fa[x][k] == fa[y][k])--k;getmax(res, val[x][k]);getmax(res, val[y][k]);x = fa[x][k];y = fa[y][k];}return res;
}template <class T>
inline bool read(T& x)
{char c;int neg = 0;if (c = getchar(), c == EOF)return false; // EOFwhile (c != '-' && (c < '0' || c > '9'))c = getchar();if (c == '-')neg = 1, c = getchar();x = (c - '0');while (c = getchar(), c >= '0' && c <= '9')x = (x << 3) + (x << 1) + (c - '0');if (neg)x = -x;return true;
}int main()
{int n, m, q;read(n);read(m);read(q);{using namespace Kruskal;for (int i = 1; i <= m; i++) {read(eg[i].u);read(eg[i].v);read(eg[i].w);}build(n, m);} // G is MSTfa[1][0] = 1;dep[1] = 1;dfs(1, 0);for (int k = 1; k < FN; k++) {for (int i = 1; i <= n; i++) {fa[i][k] = fa[fa[i][k - 1]][k - 1];val[i][k] = max(val[i][k - 1], val[fa[i][k - 1]][k - 1]);}}for (int i = 1; i <= q; i++) {read(que[i].l);read(que[i].r);read(que[i].k);read(que[i].c);que[i].x = i;}sort(que + 1, que + q + 1, cmpkc);int tmp[N], tlen;for (int x = 1; x <= q; x++) {int k = que[x].k, c = que[x].c;if (k != que[x - 1].k || c != que[x - 1].c) {// not same, rebuild segtreetlen = 0;for (int i = c; i + k <= n; i += k) {tmp[++tlen] = query(i, i + k);}T.build(tmp, 1, 1, tlen);}ans[que[x].x] = T.query(1, 1, tlen, (que[x].l - c + k - 1) / k + 1, (que[x].r - c) / k);}for (int i = 1; i <= q; i++) {printf("%d\n", ans[i]);}return 0;
}

评测记录截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140357.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

web前端float布局、flex布局

1、float布局 <!DOCTYPE html> <html> <head><title>Login Page</title><style>body {font-family: Arial, sans-serif;background-color: #f3f3f3;}.container {max-width: 400px;margin: 0 auto;padding: 40px;background-color: #fff;…

什么是WhatsApp群发,WhatsApp协议,WhatsApp云控

那么WhatsApp群控云控可以做什么呢&#xff1f; 1、获客 自动化引流&#xff0c;强大的可控性&#xff0c;产品快速拓客 2、导流 一键式傻瓜化自动加好友&#xff0c;群发&#xff0c;朋友圈营销 3、群控 一键式拉群好友&#xff0c;建群&#xff0c;进群 …

前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏

文章目录 ⭐前言⭐引入ckeditor⭐npm 包引入⭐cdn资源引入 ⭐自定义插件&#x1f496; 自定义yma16配置插件 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前端react整合ckeditor——配置插件、自定义toolbar工具栏。 react系列往期文章&#xff…

大数据的崭露头角:数据湖与数据仓库的融合之道

文章目录 数据湖与数据仓库的基本概念数据湖&#xff08;Data Lake&#xff09;数据仓库&#xff08;Data Warehouse&#xff09; 数据湖和数据仓库的优势和劣势数据湖的优势数据湖的劣势数据仓库的优势数据仓库的劣势 数据湖与数据仓库的融合之道1. 数据分类和标记2. 元数据管…

停车场系统源码

源码下载地址&#xff08;小程序开源地址&#xff09;&#xff1a;停车场系统小程序&#xff0c;新能源电动车充电系统&#xff0c;智慧社区物业人脸门禁小程序: 【涵盖内容】&#xff1a;城市智慧停车系统&#xff0c;汽车新能源充电&#xff0c;两轮电动车充电&#xff0c;物…

KT142C语音芯片flash型用户如何更新固件的说明_V2

目录 一、简介 2.1 让芯片进入PC模式 2.2 双击提供的exe程序即可 一、简介 正常的情况下&#xff0c;用户肯定是不需要更新固件的&#xff0c;因为芯片出厂默认就烧录了对应的程序固件&#xff0c;但是有客户可能需要小修小改&#xff0c;或者订制一下某些功能&#xff0c…

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

list(3) — Linux manual page 用Visual Studio 2022创建CMake项目 * CmakeLists.txt # CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.12)project ("llist")# I…

JVM高级性能调试

标准的JVM是配置为了高吞吐量&#xff0c;吞吐量是为了科学计算和后台运行使用&#xff0c;而互联网商业应用&#xff0c;更多是为追求更短的响应时间&#xff0c;更低的延迟Latency&#xff08;说白了就是更快速度&#xff09;&#xff0c;当用户打开网页没有快速响应&#xf…

多线程带来的的风险-线程安全

多线程带来的的风险-线程安全 ~~ 多线程编程中,最难的地方,也是一个最重要的地方&#xff0c;还是一个最容易出错的地方,更是一个面试中特别爱考的地方.❤️❤️❤️ 线程安全的概念 万恶之源,罪魁祸首是多线程的抢占式执行,带来的随机性.~~&#x1f615;&#x1f615;&…

LeetCode75-06:移动零

移动零 初版(bug) func moveZeroes(nums []int) {if len(nums) 1{return}// 设置两个指针fp1,fp2分别指向第一个元素和第二个元素&#xff0c;// 两种情况// 假如指针fp1指向元素为零// 1) *fp2!0&#xff0c;则交换。// 2) *fp20&#xff0c;则fp2后移,直至*fp2!0,与fp1交换…

idea如何关闭项目文件显示的浏览器图标

这里写自定义目录标题 1.idea经常项目文件右上角弹出图标2.setting中Tools 取消勾选浏览器 1.idea经常项目文件右上角弹出图标 2.setting中Tools 取消勾选浏览器

深度学习自学笔记二:逻辑回归和梯度下降法

目录 一、逻辑回归 二、逻辑回归的代价函数 三、梯度下降法 一、逻辑回归 逻辑回归是一种常用的二分类算法&#xff0c;用于将输入数据映射到一个概率输出&#xff0c;表示为属于某个类别的概率。它基于线性回归模型&#xff0c;并使用了sigmoid函数作为激活函数。 假设我们…

数据结构与算法-时间复杂度与空间复杂度

数据结构与算法 &#x1f388;1.概论&#x1f52d;1.1什么是数据结构&#xff1f;&#x1f52d;1.2什么是算法&#xff1f; &#x1f388;2.算法效率&#x1f52d;2.1如何衡量一个算法的好坏&#xff1f;&#x1f52d;2.2算法的复杂度&#x1f52d;2.3时间复杂度&#x1f4d6;2…

【数据结构】七大排序算法详解

目录 ♫什么是排序 ♪排序的概念 ♪排序的稳定性 ♪排序的分类 ♪常见的排序算法 ♫直接插入排序 ♪基本思想 ♪算法实现 ♪算法稳定性 ♪时间复杂度 ♪空间复杂度 ♫希尔排序 ♪基本思想 ♪算法实现 ♪算法稳定性 ♪时间复杂度 ♪空间复杂度 ♫直接选择排序 ♪基本思想 ♪算法…

MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])

MongoDB使用配置文件启动、添加为系统服务及设置自启动 1.是什么2.下载安装启动配置2.1 下载2.2 安装2.3 配置2.4 使用配置文件启动 3.设置系统服务及自启动3.1 设置为系统服务3.2 自启动 1.是什么 【以下内容来自ChatGPT3.5】 MongoDB是一个流行的开源文档型数据库管理系统&a…

SpringBoot实战(二十四)集成 LoadBalancer

目录 一、简介1.定义2.取代 Ribbon3.主要特点与功能4.LoadBalancer 和 OpenFeign 的关系 二、使用场景一&#xff1a;Eureka LoadBalancer服务A&#xff1a;loadbalancer-consumer 消费者1.Maven依赖2.application.yml配置3.RestTemplateConfig.java4.DemoController.java 服务…

力扣刷题-链表理论基础

什么是链表 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&a…

金融风控建模常用指标介绍(WOE, IV, KS, PSI)

金融风控建模常用指标介绍&#xff08;WOE, IV, KS, PSI&#xff09; 近期在做金融风控相关项目&#xff0c;有必要把特征和模型的衡量指标总结下&#xff0c;以备不时之需。这次主要介绍4个指标&#xff08;WOE, IV, KS, PSI&#xff09;。 WOE&#xff08;Weight of Evidenc…

力扣-228.汇总区间

AC Code 自己做出来的&#xff0c;代码写的很烂&#xff0c;但是也浅浅记录一下叭&#xff0c;下面有看答案思路写出来的双指针代码 class Solution { public:vector<string> summaryRanges(vector<int>& nums) {vector<string> ans;int n nums.size();…

上市公司-供应链数字化示范名单匹配(2000-2022年)

参考《经济管理》刘海建&#xff08;2023&#xff09;、《中国软科学》张树山&#xff08;2021&#xff09;的做法&#xff0c;将商务部公开的“供应链创新与应用试点企业、试点城市”分别与上市公司匹配&#xff0c;得到2份DID数据 一、数据介绍 数据名称&#xff1a;上市公司…