bzoj 2001 CITY 城市建设 cdq分治
题解:
对整个修改的区间进行分治。对于当前修改区间来说,我们对整幅图中将要修改的边权都先改成-inf,跑一遍最小生成树,然后对于一条树边并且他的权值不为-inf,那么这条边一定就是树边了。然后我们把这些点都缩成一个点。然后,我们继续对当前修改区间来说,我们把要修改的边的边权都修改成inf,跑一遍最小生成树,然后对于一条非树边来说,他的边权不为inf,那么这条边一点是非树边了,然后我们每层缩点,减边,这样图就会越来越小,然后当l == r的时候,我们还原修改操作,最后把跑最小生成树计算答案。
一道神奇的cdq题目。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
- #define LL long long
- #define ULL unsigned LL
- #define fi first
- #define se second
- #define pb push_back
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define lch(x) tr[x].son[0]
- #define rch(x) tr[x].son[1]
- #define max3(a,b,c) max(a,max(b,c))
- #define min3(a,b,c) min(a,min(b,c))
- typedef pair<int,int> pll;
- const int inf = 0x3f3f3f3f;
- const LL INF = 0x3f3f3f3f3f3f3f3f;
- const LL mod = (int)1e9+;
- const int N = 1e5 + ;
- struct Node{
- int u, v, c, id;
- bool operator < (const Node & x) const{
- return c < x.c;
- }
- }e[][N], f[N], g[N];
- int a[N], b[N], ct[N], mapid[N];
- int pre[N];
- int to[N];
- void link(int u, int v){
- mapid[to[v]] = ;
- mapid[u] = v;
- to[v] = u;
- }
- int Find(int x){
- if(x == pre[x]) return x;
- return pre[x] = Find(pre[x]);
- }
- LL ans[N];
- void Clear(int tot){
- for(int i = ; i <= tot; i++){
- pre[f[i].u] = f[i].u;
- pre[f[i].v] = f[i].v;
- }
- }
- void contraction(int &tot, LL &sum){
- Clear(tot);
- sort(f+, f++tot);
- int u, v, zz = ;
- for(int i = ; i <= tot; i++){
- u = Find(f[i].u), v = Find(f[i].v);
- if(u != v){
- pre[u] = v;
- if(f[i].c != -inf){
- sum += f[i].c;
- g[++zz] = f[i];
- }
- }
- }
- Clear(tot);
- for(int i = ; i <= zz; i++){
- u = Find(g[i].u); v = Find(g[i].v);
- pre[u] = v;
- }
- zz = ;
- for(int i = ; i <= tot; i++){
- u = Find(f[i].u), v = Find(f[i].v);
- if(u != v){
- f[++zz] = f[i];
- f[zz].u = u;
- f[zz].v = v;
- mapid[f[i].id] = zz;
- }
- }
- tot = zz;
- return ;
- }
- void reduction(int &tot){
- Clear(tot);
- sort(f+, f++tot);
- int u, v, zz = ;
- for(int i = ; i <= tot; i++){
- u = Find(f[i].u); v = Find(f[i].v);
- if(u != v){
- pre[u] = v;
- f[++zz] = f[i];
- }
- else if(f[i].c == inf)
- f[++zz] = f[i];
- }
- tot = zz;
- return ;
- }
- void cdq(int l, int r, int now, int tot, LL sum){
- if(l == r) ct[a[l]] = b[l];
- for(int i = ; i <= tot; i++){
- e[now][i].c = ct[e[now][i].id];
- mapid[e[now][i].id] = i;
- //link(e[now][i])
- f[i] = e[now][i];
- }
- if(l == r){
- ans[l] = sum;
- Clear(tot);
- sort(f+, f++tot);
- int u, v;
- for(int i = ; i <= tot; i++){
- u = Find(f[i].u), v = Find(f[i].v);
- if(u != v){
- pre[u] = v;
- ans[l] += f[i].c;
- }
- }
- return ;
- }
- for(int i = l; i <= r; i++) f[mapid[a[i]]].c = -inf;
- contraction(tot, sum);
- for(int i = l; i <= r; i++) f[mapid[a[i]]].c = inf;
- reduction(tot);
- for(int i = ; i <= tot; i++) e[now+][i] = f[i];
- int mid = l+r >> ;
- cdq(l, mid, now+, tot, sum);
- cdq(mid+, r, now+, tot, sum);
- }
- int main(){
- int n, m, q;
- scanf("%d%d%d", &n, &m, &q);
- for(int i = ; i <= m; i++){
- scanf("%d%d%d", &e[][i].u, &e[][i].v, &e[][i].c);
- e[][i].id = i;
- ct[i] = e[][i].c;
- }
- for(int i = ; i <= q; i++)
- scanf("%d%d", &a[i], &b[i]);
- cdq(,q,,m,);
- for(int i = ; i <= q; ++i)
- printf("%lld\n", ans[i]);
- return ;
- }
bzoj 2001 CITY 城市建设 cdq分治的更多相关文章
- bzoj 2001: City 城市建设 cdq
题目 PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有 ...
- BZOJ2001 [Hnoi2010]City 城市建设 CDQ分治
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec Memory Limit: 162 MB Description PS国是一个拥有诸多城市的大国,国王Lou ...
- BZOJ 2001: [Hnoi2010]City 城市建设
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 555[Submit][ ...
- 【BZOJ2001】 [Hnoi2010]City 城市建设
BZOJ2001 [Hnoi2010]City 城市建设 Solution 我们考虑一下这个东西怎么求解? 思考无果...... 咦? 好像可以离线cdq,每一次判断一下如果这条边如果不选就直接删除, ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- BZOJ2001 [Hnoi2010]City 城市建设 【CDQ分治 + kruskal】
题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上 ...
- BZOJ2001: [Hnoi2010]City 城市建设
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001 cdq分治+重建图. 可以保留当前一定会被选的非修改边然后把点缩起来.这样的话每次点数至 ...
- 【bzoj2001】 Hnoi2010—City 城市建设
http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之 ...
- BZOJ 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
随机推荐
- CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较
写在前面: 由于红帽在Linux界的影响力,相信很多朋友在测试和生产系统用的是RedHat或者CentOS系统,这次我在CentOS系统上遇到了一个很有意思的故障,通过这次故障的原因分析及解决,特意写 ...
- 5.源码分析---SOFARPC调用服务
我们这一次来接着上一篇文章<4. 源码分析---SOFARPC服务端暴露>讲一下服务暴露之后被客户端调用之后服务端是怎么返回数据的. 示例我们还是和上篇文章一样使用一样的bolt协议来讲: ...
- java8中使用函数式接口
使用函数式接口 Predicate @FunctionalInterface interface Predicate<T>{ boolean test(T t); } public sta ...
- .net core web api部署到Linux系统CentOS 7
一.创建一个.net core web api 的Demo 完成后的项目结构如图 修改下监听端口 发布代码 二.发布到CentOS 7上并运行 下一步需要一定的虚拟机知识了,我这里使用了windows ...
- 《HTTP权威指南》--阅读笔记(一)
HTTP: HyperText Transfer Protocol 测试站点:http://www.joes-hardware.com URI包括URL和URN URI: Uniform Resour ...
- 如何为 caddy 添写自定义插件
如何为 caddy 添写自定义插件 项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin 前言 Ca ...
- 利用反射,更改string对象的value数组以达到改变string值。
package test; import java.lang.reflect.Field; import lombok.Value; public class Test1{ public static ...
- egg 自学入门demo分享
目录 安装 项目 连接数据库 编写model 编写controller 添加路由 2018-08,本文适用于对egg有兴趣想要了解的同学 完整项目代码:https://github.com/NameH ...
- Compatibility模式安装windows7后改为AHCI模式无法启动Windows7的解决办法
在用Compatibility模式安装Windows 7后,再在BIOS中去开启SATA硬盘的AHCI功能的话,就会出现无法启动的情况.只有改回Compatibility模式后,系统才恢复正常.经过试 ...
- java高并发系列 - 第25天:掌握JUC中的阻塞队列
这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...