【BZOJ】【2594】【WC2006】水管局长数据加强版
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处,嘟嘟需要为供水公司找到一 ...
随机推荐
- javascript将浮点数转换成整数的三个方法
浮点数转换成整数方法有很多,本例为大家介绍常用的三个方法,如果读者想到其他好用方法,也可以交流一下 Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseI ...
- ajax 返回数据 无法得到其属性的解决办法
当我们用ajax无法 得到其属性.正常情况下是: <script type="text/javascript"> function useAjax(sen ...
- 【转义字符】HTML 字符实体< >: &等
在开发中遇到javascript从后台获取的url 会被转义,如:http://localhost:8080/Home/Index?a=14&b=15&c=123,想把它转成http: ...
- BoneCP主要配置参数
二.BoneCP主要配置参数 1.jdbcUrl 设置数据库URL 2.username 设置数据库用户名 3.password 设置数据库密码 4.partitionCount 设置分区个数.这个参 ...
- 大饱眼福 7款类型各异的CSS3实用菜单
1.清新小图标的HTML5/CSS3侧边栏菜单 前我们分享过几款CSS3侧边栏菜单,像CSS3侧边栏菜单 带可爱的小图标菜单和CSS3侧边栏手风琴菜单,都非常不错.今天我们要分享的这款CSS3侧边栏菜 ...
- frame和iframe区别
1.frame不能脱离frameSet单独使用,iframe可以: 2.frame不能放在body中:如下可以正常显示: <!--<body>--> <frameset ...
- 【风马一族_Python】 决策树
<机器学习实战>第三章 决策树 ------------------------------------- #1 trees.py 计算给定数据集的香农熵 ---------------- ...
- 《APUE》第四章笔记(4)
这算是在博客园写的第一篇文章啊,之前都在csdn写(虽然才写了几篇,因为开通也没多少天..),还是稍微期待下吧.我写博客的主要意图是一来能够记录下来自己所学过的东西,二来也想能够跟大家交流,能够得到更 ...
- silverlight 生成二维码
MainPage.xaml <Grid x:Name="LayoutRoot" Background="White"> <Border Bor ...
- 如何使用js捕获css3动画
如何使用js捕获css3动画 css3动画功能强大,但是不像js,没有逐帧控制,但是可以通过js事件来确定任何动画的状态. 下面是一段css3动画代码: #anim.enable{ -webkit-a ...