【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处,嘟嘟需要为供水公司找到一 ...
随机推荐
- 第九篇、自定义底部UITabBar
国际惯例先上图: 代码实现(在UITabBarViewController设置): - (void)setUpTabBar { LHLTabBar *tabBar = [[LHLTabBar allo ...
- Mysql中使用FIND_IN_SET解决IN条件为字符串时只有第一个数据可用的问题
今天在使用Mysql的存储过程处理数据的批量删除时,遇到了WHERE条件中使用IN(strlist)时(strlist为逗号分隔的字符串),只有strlist的第一个元素才有效的问题,现在将问题和解决 ...
- 九款酷炫基于jquery实现的应用及源码
1.HTML5 Loading动画加载 五彩的圆环Loading 今天我们要分享一款基于HTML5的Loading加载动画特效,这款HTML5加载动画是一个五彩的圆环,圆环不停地转动从而体现加载正在进 ...
- 使用FlashFXP V3.8烈火汉化绿色版软件连接Linux
使用FlashFXP V3.8烈火汉化绿色版软件连接Linux 单击右上角的小闪电图标: 特别注意:出于安全考虑,FTP默认禁止使用root账号登陆Linux主机,必须使用除root用户以外的其他用户 ...
- 用cudamat做矩阵运算的GPU加速
1. cudamat简介 cudamat是一个python语言下,利用NVIDIA的cuda sdk 进行矩阵运算加速的库.对于不熟悉cuda编程的程序员来说,这是一个非常方便的GPU加速方案.很多工 ...
- Python单元测试——深入理解unittest (转)
单元测试的重要性就不多说了,可恶的是Python中 有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, no ...
- UIScrollView,UIPageControl
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIScrollViewDelegate&g ...
- 解决grub引导错误的一次经历
我的电脑上一共是两块硬盘,1块固态硬盘(sda)装了win7,另外一块普通硬盘(sdb)装了ubuntu和centos两个系统,系统启动的引导是装在sdb上面的ubuntu的grub2,它负责选择不同 ...
- OS X EI Capitan安装mcrypt
OS X EI Capitan安装mcrypt (我的博客原文:http://www.jmolboy.com/2015/12/01/mcrypt-extension-on-EI-Capitan/) ...
- WPF 绑定三(绑定List中指定的字符串)
xaml: <Window x:Class="WpfApplication1.Window3" xmlns="http://schemas.microsoft.co ...