题目传送门

题解:

对整个修改的区间进行分治。对于当前修改区间来说,我们对整幅图中将要修改的边权都先改成-inf,跑一遍最小生成树,然后对于一条树边并且他的权值不为-inf,那么这条边一定就是树边了。然后我们把这些点都缩成一个点。然后,我们继续对当前修改区间来说,我们把要修改的边的边权都修改成inf,跑一遍最小生成树,然后对于一条非树边来说,他的边权不为inf,那么这条边一点是非树边了,然后我们每层缩点,减边,这样图就会越来越小,然后当l == r的时候,我们还原修改操作,最后把跑最小生成树计算答案。

一道神奇的cdq题目。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
  4. #define LL long long
  5. #define ULL unsigned LL
  6. #define fi first
  7. #define se second
  8. #define pb push_back
  9. #define lson l,m,rt<<1
  10. #define rson m+1,r,rt<<1|1
  11. #define lch(x) tr[x].son[0]
  12. #define rch(x) tr[x].son[1]
  13. #define max3(a,b,c) max(a,max(b,c))
  14. #define min3(a,b,c) min(a,min(b,c))
  15. typedef pair<int,int> pll;
  16. const int inf = 0x3f3f3f3f;
  17. const LL INF = 0x3f3f3f3f3f3f3f3f;
  18. const LL mod = (int)1e9+;
  19. const int N = 1e5 + ;
  20. struct Node{
  21. int u, v, c, id;
  22. bool operator < (const Node & x) const{
  23. return c < x.c;
  24. }
  25. }e[][N], f[N], g[N];
  26. int a[N], b[N], ct[N], mapid[N];
  27. int pre[N];
  28. int to[N];
  29. void link(int u, int v){
  30. mapid[to[v]] = ;
  31. mapid[u] = v;
  32. to[v] = u;
  33. }
  34. int Find(int x){
  35. if(x == pre[x]) return x;
  36. return pre[x] = Find(pre[x]);
  37. }
  38. LL ans[N];
  39. void Clear(int tot){
  40. for(int i = ; i <= tot; i++){
  41. pre[f[i].u] = f[i].u;
  42. pre[f[i].v] = f[i].v;
  43. }
  44. }
  45. void contraction(int &tot, LL &sum){
  46. Clear(tot);
  47. sort(f+, f++tot);
  48. int u, v, zz = ;
  49. for(int i = ; i <= tot; i++){
  50. u = Find(f[i].u), v = Find(f[i].v);
  51. if(u != v){
  52. pre[u] = v;
  53. if(f[i].c != -inf){
  54. sum += f[i].c;
  55. g[++zz] = f[i];
  56. }
  57. }
  58. }
  59. Clear(tot);
  60. for(int i = ; i <= zz; i++){
  61. u = Find(g[i].u); v = Find(g[i].v);
  62. pre[u] = v;
  63. }
  64. zz = ;
  65. for(int i = ; i <= tot; i++){
  66. u = Find(f[i].u), v = Find(f[i].v);
  67. if(u != v){
  68. f[++zz] = f[i];
  69. f[zz].u = u;
  70. f[zz].v = v;
  71. mapid[f[i].id] = zz;
  72. }
  73. }
  74. tot = zz;
  75. return ;
  76. }
  77. void reduction(int &tot){
  78. Clear(tot);
  79. sort(f+, f++tot);
  80. int u, v, zz = ;
  81. for(int i = ; i <= tot; i++){
  82. u = Find(f[i].u); v = Find(f[i].v);
  83. if(u != v){
  84. pre[u] = v;
  85. f[++zz] = f[i];
  86. }
  87. else if(f[i].c == inf)
  88. f[++zz] = f[i];
  89. }
  90. tot = zz;
  91. return ;
  92. }
  93. void cdq(int l, int r, int now, int tot, LL sum){
  94. if(l == r) ct[a[l]] = b[l];
  95. for(int i = ; i <= tot; i++){
  96. e[now][i].c = ct[e[now][i].id];
  97. mapid[e[now][i].id] = i;
  98. //link(e[now][i])
  99. f[i] = e[now][i];
  100. }
  101. if(l == r){
  102. ans[l] = sum;
  103. Clear(tot);
  104. sort(f+, f++tot);
  105. int u, v;
  106. for(int i = ; i <= tot; i++){
  107. u = Find(f[i].u), v = Find(f[i].v);
  108. if(u != v){
  109. pre[u] = v;
  110. ans[l] += f[i].c;
  111. }
  112. }
  113. return ;
  114. }
  115. for(int i = l; i <= r; i++) f[mapid[a[i]]].c = -inf;
  116. contraction(tot, sum);
  117. for(int i = l; i <= r; i++) f[mapid[a[i]]].c = inf;
  118. reduction(tot);
  119. for(int i = ; i <= tot; i++) e[now+][i] = f[i];
  120. int mid = l+r >> ;
  121. cdq(l, mid, now+, tot, sum);
  122. cdq(mid+, r, now+, tot, sum);
  123.  
  124. }
  125. int main(){
  126. int n, m, q;
  127. scanf("%d%d%d", &n, &m, &q);
  128. for(int i = ; i <= m; i++){
  129. scanf("%d%d%d", &e[][i].u, &e[][i].v, &e[][i].c);
  130. e[][i].id = i;
  131. ct[i] = e[][i].c;
  132. }
  133. for(int i = ; i <= q; i++)
  134. scanf("%d%d", &a[i], &b[i]);
  135. cdq(,q,,m,);
  136. for(int i = ; i <= q; ++i)
  137. printf("%lld\n", ans[i]);
  138. return ;
  139. }

bzoj 2001 CITY 城市建设 cdq分治的更多相关文章

  1. bzoj 2001: City 城市建设 cdq

    题目 PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的道路使得国内所有 ...

  2. BZOJ2001 [Hnoi2010]City 城市建设 CDQ分治

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MB Description PS国是一个拥有诸多城市的大国,国王Lou ...

  3. BZOJ 2001: [Hnoi2010]City 城市建设

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 555[Submit][ ...

  4. 【BZOJ2001】 [Hnoi2010]City 城市建设

    BZOJ2001 [Hnoi2010]City 城市建设 Solution 我们考虑一下这个东西怎么求解? 思考无果...... 咦? 好像可以离线cdq,每一次判断一下如果这条边如果不选就直接删除, ...

  5. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  6. BZOJ2001 [Hnoi2010]City 城市建设 【CDQ分治 + kruskal】

    题目链接 BZOJ2001 题解 CDQ分治神题... 难想难写.. 比较朴素的思想是对于每个询问都求一遍\(BST\),这样做显然会爆 考虑一下时间都浪费在了什么地方 我们每次求\(BST\)实际上 ...

  7. BZOJ2001: [Hnoi2010]City 城市建设

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2001 cdq分治+重建图. 可以保留当前一定会被选的非修改边然后把点缩起来.这样的话每次点数至 ...

  8. 【bzoj2001】 Hnoi2010—City 城市建设

    http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之 ...

  9. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

随机推荐

  1. CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较

    写在前面: 由于红帽在Linux界的影响力,相信很多朋友在测试和生产系统用的是RedHat或者CentOS系统,这次我在CentOS系统上遇到了一个很有意思的故障,通过这次故障的原因分析及解决,特意写 ...

  2. 5.源码分析---SOFARPC调用服务

    我们这一次来接着上一篇文章<4. 源码分析---SOFARPC服务端暴露>讲一下服务暴露之后被客户端调用之后服务端是怎么返回数据的. 示例我们还是和上篇文章一样使用一样的bolt协议来讲: ...

  3. java8中使用函数式接口

    使用函数式接口 Predicate @FunctionalInterface interface Predicate<T>{ boolean test(T t); } public sta ...

  4. .net core web api部署到Linux系统CentOS 7

    一.创建一个.net core web api 的Demo 完成后的项目结构如图 修改下监听端口 发布代码 二.发布到CentOS 7上并运行 下一步需要一定的虚拟机知识了,我这里使用了windows ...

  5. 《HTTP权威指南》--阅读笔记(一)

    HTTP: HyperText Transfer Protocol 测试站点:http://www.joes-hardware.com URI包括URL和URN URI: Uniform Resour ...

  6. 如何为 caddy 添写自定义插件

    如何为 caddy 添写自定义插件 项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin 前言 Ca ...

  7. 利用反射,更改string对象的value数组以达到改变string值。

    package test; import java.lang.reflect.Field; import lombok.Value; public class Test1{ public static ...

  8. egg 自学入门demo分享

    目录 安装 项目 连接数据库 编写model 编写controller 添加路由 2018-08,本文适用于对egg有兴趣想要了解的同学 完整项目代码:https://github.com/NameH ...

  9. Compatibility模式安装windows7后改为AHCI模式无法启动Windows7的解决办法

    在用Compatibility模式安装Windows 7后,再在BIOS中去开启SATA硬盘的AHCI功能的话,就会出现无法启动的情况.只有改回Compatibility模式后,系统才恢复正常.经过试 ...

  10. java高并发系列 - 第25天:掌握JUC中的阻塞队列

    这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...