「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市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...
随机推荐
- leetcode73
public class Solution { public void SetZeroes(int[,] matrix) { ); ); var listrow = new Dictionary< ...
- lookup 控件
lookup->ADOQuery->Connection = DataModule1->ADOConnection1; lookup->ADOQuery->SQL-> ...
- 关于使用testng的retry问题
总体是利用TestNG里面的IRetryAnalyzer.TestListenerAdapter接口来实现相关问题 1.定义一个自己的retryanalyzer import org.testng.I ...
- 使用jpcap获取网卡硬件
- PHP 文件处理(综合)
1.获取远程文件大小:php获得远程文件大小的函数php获得远程文件大小的函数文件的大小函数为:filesize()文件是否存在的函数为:file_exits();但是这两个函数只针对本地那么:远程文 ...
- [leetcode]253. Meeting Rooms II 会议室II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- Linux之chmod使用
Linux文件分三种身份和四中权限. u:文件的拥有者 g:文件所属的群组 o:其他用户 对于每个身份,又有四种权限,分别为: r:读取文件的权限(read) w:写入文件的权限(write) x:执 ...
- R语言中 fitted()和predict()的区别
fitted是拟合值,predict是预测值.模型是基于给定样本的值建立的,在这些给定样本上做预测就是拟合.在新样本上做预测就是预测. 你可以找一组数据试试,结果如何. fit<-lm(weig ...
- WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法
WAMP不能启动, 一直处于红色图标(正常启动为绿色吧) 考虑是端口的问题,我找到wamp文件夹中的wamp\bin\apache\apache2.2.22\conf路径下的httpd.conf文件, ...
- swift学习之-- UIAlertViewController -alert
// // ViewController.swift // alertView // // Created by su on 15/12/7. // Copyright © 2015年 tia ...