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 n−1,并且有很多好用的特征。
任选一点使之成为有根树,树上任意两点有且仅有一条简单路径,也即两点分别向上连到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⋅n⋅logn)
查询的总复杂度显然是 Θ ( q ⋅ log n ) \Theta(q \cdot \log n) Θ(q⋅logn),两部分都完全没毛病。
不过在线练习系统只给了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;
}
相关文章:

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)
10. 灾后重建 Pear市一共有N(<50000)个居民点,居民点之间有M(<200000)条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近,一次严重的地震毁坏了全部M条道路。 震后…...
Elasticsearch(四)深分页Scroll
一、前言 1.1、scroll与fromsize区别 ES对于fromsize的个数是有限制的,二者之和不能超过1w。当所请求的数据总量大于1w时,可用scroll来代替fromsize。 fromsize在ES查询数据的方式步骤如下: 1、先将用户指定的关键字进行分词;…...

JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合
目录 实现思路 会话跟踪的三个方案--引出Jwt令牌技术 1.访问cookie的值,在同一会话的不同请求之间共享数据 2.session 3.现代普遍采用的令牌技术--JWT令牌 JWT令牌技术 第一步--生成令牌 1.引入依赖 2.生成令牌 第二步--校验令牌 第三步--登录下发令牌 需要解决的…...

Sparta工具用法描述之信息收集(漏洞分析)
声明:本文仅做学习与交流,任何用于非法用途、行为等造成他人损失的,责任自负。本文不承担任何法律责任。 Sparta是python GUI应用程序,它通过在扫描和枚举阶段协助渗透测试仪来简化网络基础结构渗透测试。 通过点击并单击工具箱并以方便的方式显示所有工具输出,它可以使测…...

Vue复选框批量删除示例
Vue复选框批量删除 通过使用v-model指令绑定单个复选框 例如<input type"checkbox" id"checkbox" v-model"checked"> 而本次我们要做的示例大致是这样的,首先可以增加内容,然后通过勾选来进行单独或者批量删除&…...

Docker自定义镜像
一、镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层结构,每一层称为一个Layer BaseImage层:包含基本的系统函数库、环境变量、文件系统其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的…...

ardupilot的编译过程
环境 树莓派4b ubuntu20.04 git 2.25.1 python3.8.10 pixhawk2.4.8 下载源码 (已经配置好git环境和ssh) git clone --recurse-submodules gitgithub.com:ArduPilot/ardupilot.gitcd ardupilotgit status使用git status检查是否下载完整 如果不完整&a…...

Unity中Shader实现模板测试Stencil
文章目录 前言一、UI中的遮罩1、Mask ——> 模板测试2、RectMask2D ——> UNITY_UI_CLIP_RECT 二、模板缓冲区Stencil一般是和Pass平行的部分,Pass部分写的是颜色缓冲区Stencil:Comp(比较操作)Pass(模版缓冲区的更新) 三、实际使用1、在…...

多线程与并发
多线程与高并发 线程的创建方式1.继承Thread类 重写run方法2.实现Runnable接口 重写run方法3. 实现Callable 重写call方法,配合FutureTask 线程的使用1.线程的状态1.1. 传统操作系统层面5种状态1.2.Java中给线程准备的6种状态 2.线程的常用方法2.1 获取当前线程2.2 …...
手写call方法
Function.prototype.myCallfunction (context,args) {console.log(arguments)//context 表示call里面的第一个参数也就是需要改变this指向的那个对象。//this表示这个方法//把这个方法挂到需要改变指向的对象身上调用,相当于把this指向了这个对象身上,从…...

基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、图像数据传输 4.2、直方图统计算法 4.3、时序控制和电路设计 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescal…...

数据库:Hive转Presto(一)
本人因为工作原因,经常使用hive以及presto,一般是编写hive完成工作,服务器原因,presto会跑的更快一些,所以工作的时候会使用presto验证结果,所以就要频繁hive转presto,为了方便,我用…...

Responder
环境准备 操作系统:Kali Linux工具:responder,john,evil-winrm PS:输入以下命令解决靶场环境无法打开问题 #echo "<靶机IP> unika.htb">>/etc/hostsresponder工具 [Kali 官网] 手册地址:https://www.kali.org/tools/responder/ 摘要: This package c…...

基于下垂控制的并网逆变器控制MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 主要模块: 建议使用MATLAB2021b及以上版本打开! 功率计算模块、下垂控制模块、电压电流双环控制模块、虚拟阻抗压降模块 扰动设置: 在0.5秒到2秒始端设置0.25Hz的电网频…...
android获取RAM、CPU频率、系统版本、CPU核数
参考链接: https://www.jianshu.com/p/76d68d13c475 https://github.com/matthewYang92/Themis 获取CPU频率、核数的逻辑,是通过文件操作实现的,Android是基于Linux系统的,所以该方式针对不同的手机都是可靠的操作方式。 RAM&am…...

微信小程序python+nodejs+php+springboot+vue 讲座预约系统
讲座预约管理系统的用户是系统最根本使用者,按需要分析系统包括用户:学生、管理员。 管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括学生信息管理和文章公告管理。讲座公告管理,添加讲座公告信息…...

嵌入式开发笔记:STM32的外设GPIO知识学习
GPIO简介: • GPIO ( General Purpose Input Output )通用输入输出口 • 可配置为 8 种输入输出模式 • 引脚电平: 0V~3.3V ,部分引脚可容忍 5V (如舵机和驱动直流电机) • 输出模式下可控制端口…...
单片机论文参考:2、基于单片机的病床呼叫系统设计
任务要求 设计病床呼叫系统,使用3X8矩阵开关分别模拟医院病房与病床位数,当某开关按下时,系统显示呼叫的病房与病床、呼叫的时间。处理完毕可清除该呼叫显示记录。同时有数个病床呼叫时,可以循环呼叫记录显示。 摘要 病房呼叫系统…...

【C语言】结构体实现位段!位段有何作用?
本篇文章目录 1. 声明位段2. 位段的内存分配3. 位段的跨平台问题4.位段的应用5. 如何解决位段的跨平台问题? 1. 声明位段 位段的声明和结构是类似的,有两个不同: 位段的成员必须是 int、unsigned int 或 char。位段的成员名后边有一个冒号和…...

msvcp140为什么会丢失?msvcp140.dll丢失的解决方法
msvcp140.dll 是一个动态链接库文件,它包含了 C 运行时库的一些函数和类,例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2015 及以上版本中的一部分,用于支持 C 应用程序的运行。如果 msvcp140.dll 丢失或损坏ÿ…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...