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】水管局长数据加强版的更多相关文章

  1. bzoj 2594: [Wc2006]水管局长数据加强版 动态树

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Sta ...

  2. BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )

    离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...

  3. BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 2917  Solved: 918[Submit][St ...

  4. 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  5. bzoj 2594: [Wc2006]水管局长数据加强版

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  6. BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  7. [BZOJ 2594] [Wc2006]水管局长数据加强版 【LCT】

    题目链接:BZOJ - 2594 题目分析 这道题如果没有删边的操作,那么就是 NOIP2013 货车运输,求两点之间的一条路径,使得边权最大的边的边权尽量小. 那么,这条路径就是最小生成树上这两点之 ...

  8. BZOJ 2594: [Wc2006]水管局长数据加强版 (LCT维护最小生成树)

    离线做,把删边转化为加边,那么如果加边的两个点不连通,直接连就行了.如果联通就找他们之间的瓶颈边,判断一下当前边是否更优,如果更优就cut掉瓶颈边,加上当前边. 那怎么维护瓶颈边呢?把边也看做点,向两 ...

  9. bzoj 2594 [Wc2006]水管局长数据加强版(LCT+最小生成树)

    [深坑勿入] [给个链接] http://blog.csdn.net/popoqqq/article/details/41348549 #include<cstdio> #include& ...

  10. 2594. [WC2006]水管局长数据加强版【LCT+最小生成树】

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

随机推荐

  1. html5的自定义data-*属性和jquery的data()方法的使用示例

    人们总喜欢往HTML标签上添加自定义属性来存储和操作数据. 但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它 ...

  2. 20150528—html使用Jquery遍历text文本框的非空验证

    <script src="jquery-1.7.2.min.js" type="text/javascript"></script> & ...

  3. ionic项目相关的操作命令

     更新npmD:\Program Files\npm-3.9.0\npmnode cli.js install npm -gf vs安装 更新node.js  windows版直接从官网下载安装包 n ...

  4. path 环境变量

    path(环境变量)是dos以前的内部命令,windows继续沿用至今.用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找.一般设定java的时候为了在任何目录下都可以运行 ...

  5. ListView Web 服务器控件概述(MSDN)

    1: "折叠"图像"展开"图像"复制"图像"复制悬停"图像 全部折叠全部展开 代码:全部 代码:多个 代码:Visual ...

  6. IOS引导页拨动4张图片最后一张停三秒进入主页,页面推送

    // //  ViewController.m // // //  Created by 张艳锋 on 15/8/26. //  Copyright (c) 2015年 张艳锋. All rights ...

  7. 对session和cookie的一些理解

    由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.);                  response.addCookie(c1);   * ...

  8. Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)

    mkisofs命令 创建光盘文件的系统的命令是mkisofs.光盘系统有多种格式,利用Linux系统提供的光盘文件系统创建 命令mkisofs,可以创建多种iso9660文件系统. 我们一般不用mki ...

  9. HTML5-draggable(拖放)

                                                   <!DOCTYPE html> <html class="no-js" ...

  10. Sql 临时表

    一个#是只能在当前打开滴查询窗体查询,两个#是能够在其他打开滴查询窗体查询 SELECT 'VR001839003YP' 列名1,'RO512498726DE' 列名2 INTO #临时表 UNION ...