水管局长数据加强版:lct,时光倒流,最小生成树,边化点
Description:
SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径,接着通过信息化的控制中心通知路径上的水管进入准备送水状态,等到路径上每一条水管都准备好了,供水公司就可以开始送水了。嘟嘟一次只能处理一项送水任务,等到当前的送水任务完成了,才能处理下一项。
在处理每项送水任务之前,路径上的水管都要进行一系列的准备操作,如清洗、消毒等等。嘟嘟在控制中心一声令下,这些水管的准备操作同时开始,但由于各条管道的长度、内径不同,进行准备操作需要的时间可能不同。供水公司总是希望嘟嘟能找到这样一条送水路径,路径上的所有管道全都准备就绪所需要的时间尽量短。嘟嘟希望你能帮助他完成这样的一个选择路径的系统,以满足供水公司的要求。另外,由于MY市的水管年代久远,一些水管会不时出现故障导致不能使用,你的程序必须考虑到这一点。
不妨将MY市的水管网络看作一幅简单无向图(即没有自环或重边):水管是图中的边,水管的连接处为图中的结点。
1 #include<cstdio> 2 #include<queue> 3 using namespace std; 4 #define lc c[p][0] 5 #define rc c[p][1] 6 int f[1200005],c[1200005][2],n,m,q,lz[1200005],mx[1200005],mxp[1200005],v[1200005]; 7 int sta[1200005],A[1000005],B[1000005],V[1000005],opt[100005],x[100005],y[100005]; 8 int lck[1000005],ans[1000005]; 9 struct hashmap{ 10 #define mod 2000003 11 int fir[2000005],l[2000005],x[2000005],y[2000005],v[2000005],cnt; 12 int &operator[](pair<int,int>p){ 13 int xx=p.first,yy=p.second; 14 if(xx<yy)xx^=yy^=xx^=yy; 15 long long hsh=(xx*19733737ll+yy)%mod; 16 for(int i=fir[hsh];i;i=l[i])if(x[i]==xx&&y[i]==yy)return v[i]; 17 l[++cnt]=fir[hsh];fir[hsh]=cnt;x[cnt]=xx;y[cnt]=yy;return v[cnt]; 18 } 19 }mm; 20 void read(int &p,register char ch=getchar()){ 21 while(ch>'9'||ch<'0')ch=getchar(); 22 while(ch<='9'&&ch>='0')p=(p<<3)+(p<<1)+ch-48,ch=getchar(); 23 } 24 bool not_root(int p){return c[f[p]][0]==p||c[f[p]][1]==p;} 25 void rev(int p){lc^=rc^=lc^=rc,lz[p]^=1;} 26 void up(int p){ 27 if(mx[lc]>mx[rc])mx[p]=mx[lc],mxp[p]=mxp[lc]; 28 else mx[p]=mx[rc],mxp[p]=mxp[rc]; 29 if(v[p]>mx[p])mx[p]=v[p],mxp[p]=p; 30 } 31 void down(int p){if(lz[p])rev(lc),rev(rc),lz[p]=0;} 32 void rotate(int p){ 33 int fa=f[p],gr=f[fa],k=c[fa][1]==p,br=c[p][!k]; 34 if(not_root(fa))c[gr][c[gr][1]==fa]=p; c[p][!k]=fa; c[fa][k]=br; 35 f[p]=gr; f[fa]=p; f[br]=fa; up(fa); 36 } 37 void splay(int p){ 38 int res=p,top=0;sta[++top]=p; 39 while(not_root(res))sta[++top]=res=f[res]; 40 while(top)down(sta[top--]); 41 while(not_root(p)){ 42 int fa=f[p],gr=f[fa]; 43 if(not_root(fa))rotate((c[fa][1]==p)^(c[gr][1]==fa)?fa:p); 44 rotate(p); 45 } 46 up(p); 47 } 48 void access(int p){for(int y=0;p;p=f[y=p])splay(p),rc=y,up(p);} 49 void make_root(int p){access(p);splay(p);rev(p);} 50 void split(int x,int y){make_root(x);access(y);splay(y);} 51 void link(int x,int y){make_root(x);f[x]=y;up(y);} 52 void cut(int x,int y){split(x,y);f[x]=c[y][0]=0;up(y);} 53 struct edge{ 54 int a,b,l,num; 55 friend bool operator<(edge a,edge b){return a.l>b.l;} 56 }e[1000005]; 57 priority_queue<edge>qu; 58 int fa[100005]; 59 int find(int k){return fa[k]==k?k:fa[k]=find(fa[k]);} 60 void Kruscal(){ 61 for(int i=1;i<=n;++i)fa[i]=i; 62 for(int i=1;i<=m;++i)if(!lck[n+i])qu.push((edge){A[i],B[i],V[i],n+i}); 63 while(!qu.empty()){ 64 int a=qu.top().a,b=qu.top().b,v=qu.top().l,num=qu.top().num;qu.pop(); 65 if(find(a)!=find(b))fa[fa[a]]=fa[b],link(a,num),link(num,b); 66 } 67 } 68 int main(){ 69 scanf("%d%d%d",&n,&m,&q); 70 for(int i=1;i<=m;++i)read(A[i]),read(B[i]),read(V[i]),mm[make_pair(A[i],B[i])]=n+i,v[n+i]=V[i]; 71 for(int i=1;i<=q;++i)read(opt[i]),read(x[i]),read(y[i]),opt[i]--; 72 for(int i=1;i<=q;++i)if(opt[i])lck[mm[make_pair(x[i],y[i])]]=1; 73 Kruscal(); 74 for(int i=q;i;--i) 75 if(opt[i]){ 76 split(x[i],y[i]);int nmx=mx[y[i]],tbc=mxp[y[i]],obj=mm[make_pair(x[i],y[i])]; 77 if(nmx<=V[obj-n])continue; 78 cut(tbc,A[tbc-n]);cut(tbc,B[tbc-n]); 79 link(obj,x[i]);link(obj,y[i]); 80 }else split(x[i],y[i]),ans[i]=mx[y[i]]; 81 for(int i=1;i<=q;++i)if(!opt[i])printf("%d\n",ans[i]); 82 }
View Code
转载于:https://www.cnblogs.com/hzoi-DeepinC/p/11567261.html
水管局长数据加强版:lct,时光倒流,最小生成树,边化点相关推荐
- BZOJ2594 水管局长数据加强版LCT
题意: 您有一个无向带权图,您需要支持两种操作. 询问两个点之间的最大权最小路径. 删除一条边. 分析: 众所周知,任意两点间最大权最小路径存在于最小生成树上,所以这道题可以动态维护最小生成树. 用到 ...
- BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...
- [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】
题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...
- 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版
来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了 ...
- 2017.10.16 水管局长水管局长数据加强版 思考记录
在ISA的指点下,彻底理解了lct(以前可能学了假的lct) 这个题不难想,就是倒着加边然后维护链上信息.. 但这题常数巨卡,卡map卡开局不上kruskal卡多余splay卡少用splay. 一般这 ...
- 数中有术:看大数据如何让“时光倒流”
据国家旅游局发布的消息:2015年,中国国内旅游突破40亿人次,旅游收入过4万亿元人民币,出境旅游1.2亿人次.中国国内旅游.出境旅游人次和国内旅游消费.境外旅游消费均列世界第一.越来越多的中国游客将 ...
- P4172 [WC2006]水管局长 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...
- [洛谷P4172] WC2006 水管局长
问题描述 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水 ...
- P4172 [WC2006]水管局长
题目链接 题目背景 SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦). 题目描述 每天供水公司可能要将一定量的水从 uuu 处送往 vvv 处,嘟嘟需要为供水公司 ...
最新文章
- faster rcnn接口_Faster R-CNN教程
- swift处理网络返回数据(封装)
- C++知识点36——使用智能指针的注意事项(下)
- 浙江理工大学信息学院本科生创新项目总结报告——简单的后台用户管理项目
- CI项目设计Redis队列
- 开发到底喜欢看怎样的需求文档
- (22)css3新增边框圆角属性border-radius
- IDC:2016年第四季度全球企业存储市场出现下滑
- sqlserver 事务日志过大 收缩方法解决方案
- tensorflow2.报错与解决 Cannot convert a symbolic Tensor
- Python 类和实例
- Flash 应用:大智慧flash版本
- 你好2019,我是全新的CPDA数据分析师课程
- CSS font-family 各名称一览表
- Unity粒子特效UI层级问题
- 后盾人tp5教程_5个出色的应用程序以开放数据为后盾
- python爬取app中的音频_Python爬取喜马拉雅音频数据详解
- PTA L2-043龙龙送外卖
- WIN10 Windows terminal 分屏
- python专业版和普通版_Pycharm专业版 社区版 教育版区别
热门文章
- Java毕设项目——人事管理系统(java+SSM+Maven+Mysql+Jsp)
- 程序员养花几个实用小技巧
- python-format
- unixbench分析_UnixBench,Bench,SuperBench 和 Zbench 四种常用云服务器综合性能测评脚本工具的对比分析以及使用教程...
- 教育机构如何给视频加密防止下载和传播?
- 训练自己的yolov5样本, 并部署到rv1126 <三>
- windows DST Root CA X3证书过期问题
- MySQL数据库13——插入数据(INSERT)
- 基于华为云弹性云服务器ECS(搭载openEuler的鲲鹏通用计算增强型)完成鲲鹏代码迁移工具实践【华为云至简致远】
- 如何把excel日期格式转换成文本日期格式