LCT
动态维护MST嘛……但是有删边= =好像没法搞的样子
离线记录所有修改&询问,倒序处理,就可以变删边为加边了~
论如何用LCT维护最小生成树:先搞出一棵最小生成树,然后每次加边(u,v)时,在LCT上询问u->v这条链上权值最大的边,如果这条边权值比新加的边权值要小,则忽略这条新加的边,否则断掉这条权值最大的边(cut),加入这条新边(link)。
然后……我不会捉……又去orz了一下Hzwer,学习了一下怎么维护边(拆边为点)……
(学来的)小技巧:因为要找是哪条边的权值最大,所以维护链上max的时候可以不维护值,而是维护一个结点的下标!(表示边的结点)
/**************************************************************
Problem: 2594
User: Tunix
Language: C++
Result: Accepted
Time:21616 ms
Memory:108244 kb
****************************************************************/ //BZOJ 2594
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*=sign;
}
/*******************tamplate********************/
const int N=;
struct LCT{
int c[N][],fa[N],v[N],size[N],mx[N];
bool rev[N];
int st[N],top;
#define L c[x][0]
#define R c[x][1]
void Push_up(int x){
mx[x]=x;
if (v[mx[L]]>v[mx[x]]) mx[x]=mx[L];
if (v[mx[R]]>v[mx[x]]) mx[x]=mx[R];
}
void Push_down(int x){
if (rev[x]) rev[x]=,rev[L]^=,rev[R]^=,swap(L,R);
}
bool not_root(int x){
return c[fa[x]][]==x || c[fa[x]][]==x;
}
void rotate(int x){
int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
if (not_root(y)) c[z][c[z][]==y]=x;
fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
Push_up(y);
}
void preview(int x){
top=; st[++top]=x;
for(;not_root(x);x=fa[x])
st[++top]=fa[x];
D(i,top,) Push_down(st[i]);
}
void splay(int x){
int y=;
for(preview(x);not_root(x);rotate(x))
not_root(y=fa[x]) ? rotate( (c[y][]==x^c[fa[y]][]==y ? x : y)), : ;
Push_up(x);
}
void access(int x,int las=){
for(;x;splay(x),c[x][]=las,las=x,x=fa[x]);
}
void makeroot(int x){
access(x),splay(x),rev[x]^=;
}
void link(int x,int y){
makeroot(x),fa[x]=y;
}
void cut(int x,int y){
makeroot(x),access(y),splay(y);
if (c[y][]==x) c[y][]=fa[x]=;
}
int query(int x,int y){
makeroot(x),access(y),splay(y);
return mx[y];
}
}t;
/*********************LCT***********************/
int n,m,Q;
struct edge{
int x,y,w,id;
bool d;
}e[N];
struct que{
int x,y,k,id,ans;
}q[N];
bool cmp(edge a,edge b){ return a.w<b.w; }
bool cmp2(edge a,edge b){ return a.x<b.x || (a.x==b.x && a.y<b.y);}
bool cmp3(edge a,edge b){ return a.id<b.id; }
int find(int x,int y){
int l=,r=m,mid;
while(l<=r){
mid=l+r>>;
if (e[mid].x<x || (e[mid].x==x && e[mid].y<y))l=mid+;
else if(e[mid].x==x && e[mid].y==y) return mid;
else r=mid-;
}
}
/********************edge&ques******************/
int fa[N];
int find(int x){ return fa[x]==x ? x : fa[x]=find(fa[x]); }
/********************并查集*********************/
int main(){
#ifndef ONLINE_JUDGE
freopen("2594.in","r",stdin);
freopen("2594.out","w",stdout);
#endif
n=getint(); m=getint(); Q=getint();
F(i,,n) fa[i]=i;
F(i,,m){
e[i].x=getint(); e[i].y=getint(); e[i].w=getint();
if (e[i].x>e[i].y) swap(e[i].x,e[i].y);
}
sort(e+,e+m+,cmp);//边权序
F(i,,m){
e[i].id=i;
t.v[n+i]=e[i].w;
t.mx[n+i]=n+i;
}
sort(e+,e+m+,cmp2);//字典序
F(i,,Q){
q[i].k=getint(); q[i].x=getint(); q[i].y=getint();
if (q[i].k==){
if (q[i].x>q[i].y) swap(q[i].x,q[i].y);
int t=find(q[i].x,q[i].y);
e[t].d=; q[i].id=e[t].id;
//找到每次删除的边在边权序中的位置
}
}
sort(e+,e+m+,cmp3);//边权序
int tot=;
F(i,,m)
if (!e[i].d){
int f1=find(e[i].x),f2=find(e[i].y);
if (f1!=f2){
fa[f1]=f2;
t.link(e[i].x,i+n); t.link(e[i].y,i+n);
tot++;
if (tot==n-) break;
}
}
D(i,Q,){
if (q[i].k==)
q[i].ans=t.v[t.query(q[i].x,q[i].y)];
else{
int k=q[i].id;
int tmp=t.query(q[i].x,q[i].y);
if (e[k].w<t.v[tmp]){
t.cut(e[tmp-n].x,tmp); t.cut(e[tmp-n].y,tmp);
t.link(q[i].x,k+n); t.link(q[i].y,k+n);
}
}
}
F(i,,Q) if(q[i].k==)
printf("%d\n",q[i].ans);
return ;
}
【BZOJ】【2594】【WC2006】水管局长数据加强版的更多相关文章
-
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) ------------------------------- ...
-
BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 2917 Solved: 918[Submit][St ...
-
【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
-
bzoj 2594: [Wc2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
-
BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
-
[BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】
题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...
-
BZOJ 2594: [Wc2006]水管局长数据加强版 (LCT维护最小生成树)
离线做,把删边转化为加边,那么如果加边的两个点不连通,直接连就行了.如果联通就找他们之间的瓶颈边,判断一下当前边是否更优,如果更优就cut掉瓶颈边,加上当前边. 那怎么维护瓶颈边呢?把边也看做点,向两 ...
-
bzoj 2594 [Wc2006]水管局长数据加强版(LCT+最小生成树)
[深坑勿入] [给个链接] http://blog.csdn.net/popoqqq/article/details/41348549 #include<cstdio> #include& ...
-
2594. [WC2006]水管局长数据加强版【LCT+最小生成树】
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
随机推荐
-
Windows Phone 8下 友盟社会化组件SDK的使用。
由于项目的需要,要将友盟的社会化组件SDK由0.9更新至2.0. 版本变化比较大. 1.很多类以及命名空间已经取消了. 如UmengSocialSDK.Net.Request命名空间, UmengSo ...
-
30Springd的包扫描——<;context:component-scan base-package=” ”/>;
在context中配置 如:在base-package指明一个包: <context:component-scan base-package="cn.edu.dao"/> ...
-
WCF技术的不同应用场景及其实现分析
这一篇文章,是总结一下WCF技术,以及基于这个技术发展出来的几个典型应用场景,并且我将尝试对这些不同的WCF实现的原理进行一些比较分析. 关于WCF这个技术的基本概念,如果你不是很清楚,可以参考一下有 ...
-
opencv3.1+cmake3.7.2+cuda9.1+vs2015+opencv-contrib+win10x64
下载cuda https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&targ ...
-
图解python中赋值、浅拷贝、深拷贝的区别
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果.下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will = ...
-
常用七种排序的python实现
1 算法复杂度 算法复杂度分为时间复杂度和空间复杂度.其中, 时间复杂度是指执行算法所需要的计算工作量:而空间复杂度是指执行这个算法所需要的内存空间. 算法的复杂性体现在运行该算法时的计算机所需资源的 ...
-
Maven的阿里云镜像
打开“Maven安装目录/conf/settings.xml”文件,找到<mirrors>节点,添加: <mirror> <id>nexus-aliyun</ ...
-
spring cloud sleuth
新建spring boot工程trace-1,添加pom依赖 <dependency> <groupId>org.springframework.cloud</group ...
-
POJO与PO、VO的区别
http://www.cnblogs.com/wangjunwei/p/3859360.html POCO的概念是从java的POJO借用而来,而两者的含义是一致的,不同的仅仅是使用的语言不一样.所以 ...
-
【Python】 linecache模块读取文件
[linecache] 过往在读取文件的时候,我们通常使用的是这种模式: with open('file.txt','r') as f: line = f.readline() while line: ...