[CDQ][最小生成树]2018 [HNOI2010]CITY 城市建设
传送门
题意:给你一张带权无向图,可修改边权,求每次修改后的最小生成树大小
分析:动态最小生成树的reduction 和 contraction 操作详见 顾昱洲《浅谈一类分治算法》,这两个操作可以缩小图的规模,把点数缩到k+1,边数2k
操作实现:
reduction:先把操作边的边权赋为inf,做一遍最小生成树,如果一条边不会被选而边权又不是inf的话,它就不可能出现在最小生成树中,可以丢掉
contraction:先把操作边的边权赋为-inf,做一遍最小生成树,则最小生成树中的所有边可以被选,缩起来
但是即使这样复杂度也很高
不难发现,一条边的修改存在于一个区间中,所以可以直接上CDQ
Code:
#include<bits/stdc++.h>
using namespace std;
inline int read(){int res=0,f=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}return res*f;
}
#define ll long long
#define inf 1ll<<50
#define N 100005
int n,m,q,a[N],sum[50];
int f[N],c[N];ll ans[N];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
struct node{int x,y;}p[N];
struct edge{int x,y,pos;ll c;}t[N],e[50][N],d[N];
bool operator < (edge a,edge b){return a.c<b.c;}
void clear(int x){for(int i=1;i<=x;i++)f[d[i].x]=d[i].x,f[d[i].y]=d[i].y;
}
void contraction(int &tot,ll &adt){int tmp=0;sort(d+1,d+1+tot);clear(tot);for(int i=1;i<=tot;i++){int fx=find(d[i].x),fy=find(d[i].y);if(fx==fy)continue;f[fx]=fy,t[++tmp]=d[i];}for(int i=1;i<=tmp;i++) f[t[i].x]=t[i].x,f[t[i].y]=t[i].y;for(int i=1;i<=tmp;i++){if(t[i].c==-inf)continue;int fx=find(t[i].x),fy=find(t[i].y);adt+=t[i].c,f[fx]=fy;}tmp=0;for(int i=1;i<=tot;i++){int fx=find(d[i].x),fy=find(d[i].y);if(fx==fy)continue;t[++tmp]=d[i];t[tmp].x=find(d[i].x);t[tmp].y=find(d[i].y);c[d[i].pos]=tmp;}tot=tmp;for(int i=1;i<=tot;i++)d[i]=t[i];
}
void reduction(int &tot){sort(d+1,d+1+tot);clear(tot);int tmp=0;for(int i=1;i<=tot;i++){int fx=find(d[i].x),fy=find(d[i].y);if(fx==fy){if(d[i].c==inf) t[++tmp]=d[i],c[d[i].pos]=tmp;continue;}f[fx]=fy;t[++tmp]=d[i],c[d[i].pos]=tmp;}tot=tmp;for(int i=1;i<=tot;i++)d[i]=t[i];
}
void solve(int l,int r,int now,ll adt){int tot=sum[now];if(l==r)a[p[l].x]=p[l].y;for(int j=1;j<=tot;j++)e[now][j].c=a[e[now][j].pos],d[j]=e[now][j],c[e[now][j].pos]=j;if(l==r){clear(tot);sort(d+1,d+1+tot);for(int j=1;j<=tot;j++){int fx=find(d[j].x),fy=find(d[j].y);if(fx==fy)continue;f[fx]=fy;adt+=d[j].c;}ans[l]=adt;return ;}int mid=(l+r)>>1;for(int i=l;i<=r;i++)d[c[p[i].x]].c=-inf;contraction(tot,adt);for(int i=l;i<=r;i++)d[c[p[i].x]].c=inf;reduction(tot);sum[now+1]=tot;for(int i=1;i<=tot;i++)e[now+1][i]=d[i];solve(l,mid,now+1,adt);solve(mid+1,r,now+1,adt);
}
int main(){n=read(),m=read(),q=read();for(int i=1;i<=m;i++){e[0][i].x=read(),e[0][i].y=read();e[0][i].pos=i,a[i]=e[0][i].c=read();}sum[0]=m;for(int i=1;i<=q;i++) p[i].x=read(),p[i].y=read();solve(1,q,0,0);for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
}
[CDQ][最小生成树]2018 [HNOI2010]CITY 城市建设相关推荐
- bzoj2001 [Hnoi2010]City 城市建设 动态最小生成树
昨晚水冬令营课件看到这题,感觉蛮有意思的,学习了一波,抽象式理解,今天又看了大佬的代码,彻底弄懂了这个东西. WC2013顾昱洲在<浅谈一类分治算法>中提到了动态最小生成树的分治做法,我来 ...
- P3206 [HNOI2010]城市建设
P3206 [HNOI2010]城市建设 题目描述 无向图上修改边权,动态维护MSTMSTMST,求每次修改后的MST的权值和. Solution 有一个简单好想的做法--LCTLCTLCT+线段树分 ...
- 埃文科技受邀参展2018中国(郑州)新型智慧城市建设暨产业高峰论坛
12月21日,由郑州市人民政府主办的"2018中国(郑州)新型智慧城市建设暨产业高峰论坛"在郑州国际会展中心正式拉开序幕,会议持续两天.埃文科技因在网络空间地图拓扑测绘大数据领域的 ...
- IEEE论文:城市大脑,基于互联网大脑模型的智慧城市建设
作者:刘锋 互联网进化论作者 计算机博士 前言:基于互联网大脑模型与智慧城市建设的结合,2015年2月在csdn第一次发布文章<基于互联网大脑架构的智慧城市建设探讨>提出了城市大脑的建设方 ...
- 基于三维实景建模与CIM的数字孪生城市建设
基于三维实景建模与CIM的数字孪生城市建设 导语 自2012年我国中央政府出台<国家智慧城市试点暂行管理办法>始,国家颁布的指导智慧城市合理发展的政策逐年增加,到2017年"建设 ...
- 原创 | 从智慧交通、智慧安防、智能电网三大应用场景看我国智慧城市建设现状...
在IBM发布的<智慧的城市在中国>一书中,对"智慧城市"下了这样的定义:"能够充分运用信息和通信技术手段感测.分析.整合城市运行核心系统的各项关键信息,从而对 ...
- 智慧城市建设:科技创业的下一个浪潮
来源:资本实验室 随着全球城市化进程的加速,越来越多的人涌进城市,这为城市建设带来了一系列的挑战:一方面,城市需要面对大量的越来越老化的基础设施:另一方面,需要为新涌入的城市居民提供新的,充足的基础设 ...
- 蚌埠智慧城市建设跻身全国22强 让数据替群众“跑腿”
近年来,作为国家首批智慧城市试点城市,蚌埠市持续推进信息化与城市化的高度融合,将智慧城市建设作为经济转型.产业升级.城市提升的新引擎.互联网+政务服务触手可及."0552工程"整合 ...
- 测评结果_刚刚,2018全国文明城市测评结果重磅公布!你的家乡排第几?
3月20日上午,中国文明网重磅公布了<全国文明城市2018年度测评结果>和<全国文明城市提名城市2018年度测评结果>. 此次发布的测评成绩和排名包括:全国文明城市中的28个省 ...
- 嘉兴新型智慧城市建设带来的三个问号
新型智慧城市,让生活更美好.日前,我市召开新型智慧城市建设领导小组(筹)第一次会议,嘉兴新型智慧城市建设由此全面启动.新型智慧城市与传统的智慧城市有何区别?嘉兴百姓何时能切身感知?我市将如何推进这项工 ...
最新文章
- BoneCP学习笔记——配置参数
- 对联想乐Pad的十大期待
- 鸿蒙系统几点更新,鸿蒙系统正式上线,第一批可升级鸿蒙系统手机公布,网友:终于等到了...
- 1041 考试座位号
- SparkContext: Error initializing SparkContext解决方法
- LAMP架构,纯文本作品
- jquery兄弟标签_js jquery获取当前元素的兄弟级 上一个 下一个元素
- 在阿里云容器服务上创建一个使用Redis的Python应用
- php amp 26472,汉字与UNICODE的转换 通过文件操作
- 图论及其应用 2011年 期末考试 答案总结
- 软件测试方法可以分为几种?
- 冗余链路引起广播风暴和MAC地址表不稳定
- 依云工资查询系统升级至6.0
- Android虚拟机多开检测
- 近几年CVPR图像压缩总结
- Mov文件字幕添加与播放
- 怎么让文件、资料变的更安全?文件加密和系统设置很重要
- logit回归怎么看显著性_请教用SPSS做两分类逻辑回归时自变量的显著性问题
- numpy的数字统计函数
- 【PS技巧】如何校正倾斜的图片
热门文章
- RGB与CMYK以及加色与减色
- 如果有人问你爬虫抓取技术的门道,请叫他来看这篇文章
- IT面试技巧经典问答
- 二项分布(Binomial Distribution)
- vue项目PC端如何适配不同分辨率屏幕
- 多视图几何三维重建实战系列之COLMAP
- 计算机表格画斜线,word表格斜线_Word2010怎么绘制斜线表头-太平洋IT百科手机版...
- 10054: An existing connection was forcibly closed by the remote host
- 22.11.16 IO day 8
- 除了加速上币,OKEx在DeFi热潮中还能做什么?