「WC2006」水管局长
题目链接
\(Solution\)
这道题实际上是维护一个最小生成树,因为正的搞不好搞,所以反着搞会比较好,现将没有没删掉的边留下来生成一颗最小生成树,再加边就好了,现在\(LCT\)
来看看怎么维护
对于一个最小生成树,加一条边后会是一个环,在环上删掉一个最大的边,还是一个最小生成树。所以我们对于加边只要判断这条边和最小生成树上最大边的大小,如果小于,则将这条边加入,原最小生成树上最大的边删除,如果大于不需要管他。
但是\(LCT\)只能维护点权,不能维护边权,不妨将这个边看成点即可
加入\((x,y)的边\)就是\(link(x,id),link(y,id),id\)为这条边的编号
\(cut\)同理
\(Code\)
#include<bits/stdc++.h>
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node {
int fa,v,lazy,ch[2];
}a[1100001];
int v[1100001],pre[100001];
map<int,int> f[100001];
int vis[1000001];
inline bool nroot(int x){
return a[a[x].fa].ch[0]==x||a[a[x].fa].ch[1]==x;
}
inline int max(int x,int y){
return v[x]>v[y]?x:y;
}
inline void pushup(int x){
a[x].v=max(a[a[x].ch[0]].v,max(a[a[x].ch[1]].v,x));
}
inline void work(int x){
int t=a[x].ch[0];
a[x].ch[0]=a[x].ch[1],a[x].ch[1]=t,a[x].lazy^=1;
}
inline void pushdown(int x){
if(a[x].lazy)
work(x),a[a[x].ch[0]].lazy^=1,a[a[x].ch[1]].lazy^=1;
}
inline void rotate(int x){
int y=a[x].fa,z=a[y].fa,k=(a[y].ch[1]==x);
if(nroot(y)) a[z].ch[a[z].ch[1]==y]=x;
a[x].fa=z,a[y].ch[k]=a[x].ch[k^1],a[a[x].ch[k^1]].fa=y;
a[x].ch[k^1]=y,a[y].fa=x;
pushup(x),pushup(y);
}
inline void down(int x){
if(nroot(x)) down(a[x].fa);
pushdown(x);
}
inline void splay(int x){
down(x);
while(nroot(x)){
int y=a[x].fa,z=a[y].fa;
if(nroot(y))
(a[y].ch[1]==x)^(a[z].ch[1]==y)?rotate(x):rotate(y);
rotate(x);
}
pushup(x);
}
inline void access(int x){
int y=0;
while(x) splay(x),a[x].ch[1]=y,pushup(y=x),x=a[x].fa;
}
inline void makeroot(int x){
access(x),splay(x),a[x].lazy^=1;
}
inline void splix(int x,int y){
makeroot(x),access(y),splay(y);
}
inline int findroot(int x){
access(x),splay(x);
while(a[x].ch[0]) pushdown(x),x=a[x].ch[0];
splay(x);
return x;
}
inline void link(int x,int y){
makeroot(x);
if(findroot(y)!=x)
a[x].fa=y;
}
inline void cut(int x,int y){
makeroot(x);
if(findroot(y)!=x||a[y].fa!=x||a[y].ch[0]) return ;
a[y].fa=a[x].ch[1]=0,pushup(x);
}
struct node1{
int x,y,z;
}b[1000001];
inline bool cmp(const node1 & a , const node1 & b ){
return a.z<b.z;
}
inline int find(int x){
return pre[x]==x?x:pre[x]=find(pre[x]);
}
int X[100001],Y[100001],opt[100001],n,m,q,ans[100001],tot;
inline void MST(){
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=m;i++){
int fx=find(b[i].x),fy=find(b[i].y);
if(!vis[i]&&fx!=fy)
link(b[i].x,i+n),link(b[i].y,i+n),pre[fx]=fy;
}
}
int main(){
n=read(),m=read(),q=read();
for(rg int i=1;i<=m;i++)
b[i].x=read(),b[i].y=read(),b[i].z=read();
sort(b+1,b+1+m,cmp);
for(rg int i=1;i<=m;i++)
f[b[i].x][b[i].y]=f[b[i].y][b[i].x]=i+n,v[i+n]=b[i].z;
for(rg int i=1;i<=q;i++){
opt[i]=read(),X[i]=read(),Y[i]=read();
if(opt[i]==2) vis[f[X[i]][Y[i]]-n]=1;
}
MST();
for(rg int i=q;i>=1;i--){
splix(X[i],Y[i]);
if(opt[i]==1)
ans[++tot]=v[a[Y[i]].v];
else{
if(v[a[Y[i]].v]>v[f[X[i]][Y[i]]]){
int x=a[Y[i]].v;
cut(b[x-n].x,x),cut(b[x-n].y,x),link(X[i],f[X[i]][Y[i]]),link(Y[i],f[X[i]][Y[i]]);
}
}
}
for(rg int i=tot;i>=1;i--)
printf("%d\n",ans[i]);
return 0;
}
「WC2006」水管局长的更多相关文章
- 【BZOJ2594】【WC2006】水管局长
日……又被傻B错坑了一整天…… 原题: SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要 ...
- BZOJ 2594 【WC2006】 水管局长数据加强版
题目链接:水管局长数据加强版 好久没写博客了…… 上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手. 首先,LCT这里不讲.这道题要求支持动态 ...
- 【BZOJ】【2594】【WC2006】水管局长数据加强版
LCT 动态维护MST嘛……但是有删边= =好像没法搞的样子 离线记录所有修改&询问,倒序处理,就可以变删边为加边了- 论如何用LCT维护最小生成树:先搞出一棵最小生成树,然后每次加边(u,v ...
- BZOJ2594: [Wc2006]水管局长数据加强版
题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...
- bzoj 2594: [Wc2006]水管局长数据加强版 动态树
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
- BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )
离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...
- [bzoj2594][Wc2006]水管局长数据加强版 (lct)
论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...
- BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 2917 Solved: 918[Submit][St ...
- BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...
随机推荐
- MPI 集合通信函数 MPI_Scatterv(),MPI_Gatherv(),MPI_Allgatherv(),MPI_Alltoall(),MPI_Alltoallv(),MPI_Alltoallw()
▶ 函数 MPI_Scatterv() 和 MPI_Gatherv() .注意到函数 MPI_Scatter() 和 MPI_Gather() 只能向每个进程发送或接受相同个数的元素,如果希望各进程获 ...
- 「小程序JAVA实战」小程序的微信api菜单操作(67)
转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudeweixinapicaidancaozuo66/ 菜单按钮的介绍, ...
- Java 堆栈,内存分配理解
Java虚拟机的堆.栈.堆栈 https://www.zhihu.com/question/29833675
- 解决opencv3运行opencv2代码时报错的修改备忘录
虽然opencv3是基于opencv2进行开发的(一部分opencv2代码在opencv3中还能正常运行),但opencv3自身也做了部分修改,而目前网上很多教程还是基于opencv2的函数API来编 ...
- (4)activiti工作流引擎之uel表达式
有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来? 这里就需要使用到activiti启动流程实例时设置一个流程实例的busines ...
- 使用ES-Hadoop 6.5.4编写MR将数据索引到ES
目录 1. 开发环境 2. 下载地址 3. 使用示例 4. 参考文献 1. 开发环境 Elasticsearch 6.5.4 ES-Hadoop 6.5.4 Hadoop 2.0.0 2. 下载地址 ...
- css position说明
absolute 生成绝对定位的元素,选择第一个position不等于 static 定位的第一个父元素进行定位. 元素的位置通过 "left", "top", ...
- MyBatis 实用篇(一)入门
MyBatis 实用篇(一)入门 MyBatis(http://www.mybatis.org/mybatis-3/zh/index.html) 是一款优秀的持久层框架,它支持定制化 SQL.存储过程 ...
- UVa 10570 Meeting with Aliens (暴力)
题意:给定一个排列,每次可交换两个数,用最少的次数把它变成一个1~n的环状排列. 析:暴力题.很容易想到,把所有的情况都算一下,然后再选出次数最少的那一个,也就是说,我们把所有的可能的形成环状排列全算 ...
- UVa 1395 Slim Span (最小生成树)
题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...