BZOJ 2594 【WC2006】 水管局长数据加强版
题目链接:水管局长数据加强版
好久没写博客了……
上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手。
首先,LCT这里不讲。这道题要求支持动态的查询两点间路径的最大值,还有删边的操作。很显然,把操作离线,倒过来做,删边变成了加边,那么只需要用LCT来动态维护最小生成树即可。和魔法森林那道题一样,把边看做点,丢到LCT中去,每次加边的时候如果形成了环,那么判断一下这条边是否需要替换掉环上的最大边,LCT即可。
求删去的边的编号时可以通过给输入的边排序,每次在其中二分查找。注意边的标号不要弄混了。
下面贴代码(自带巨大常数):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1100010 using namespace std;
typedef long long llg; struct data{
int u,v,c,b,id;
}a[maxn],b[maxn];
int s[maxn][2],addv[maxn],maxv[maxn],ff[maxn];
int val[maxn],d[maxn],n,m,q,fa[maxn],ans[maxn];
bool rev[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} bool cmp1(data a,data b){return a.u==b.u?a.v<b.v:a.u<b.u;}
bool cmp2(data a,data b){return a.b==b.b?a.c<b.c:a.b<b.b;} bool isroot(int u){return u!=s[fa[u]][0] && u!=s[fa[u]][1];}
void update(int u){
int l=s[u][0],r=s[u][1]; maxv[u]=u;
if(val[maxv[l]]>val[maxv[u]]) maxv[u]=maxv[l];
if(val[maxv[r]]>val[maxv[u]]) maxv[u]=maxv[r];
} void rotate(int u){
int p=fa[u],g=fa[p];
bool l=(u==s[p][1]),r=!l;
if(!isroot(p)) s[g][p==s[g][1]]=u;
fa[s[u][r]]=p; s[p][l]=s[u][r];
s[u][r]=p; fa[p]=u; fa[u]=g;
update(p); update(u);
} void splay(int u){
d[d[0]=1]=u;
for(int i=u;!isroot(i);i=fa[i]) d[++d[0]]=fa[i];
for(int i=d[0],x;x=d[i],i;i--)
if(rev[x]){
swap(s[x][0],s[x][1]); rev[x]=0;
rev[s[x][0]]^=1; rev[s[x][1]]^=1;
}
while(!isroot(u)){
int p=fa[u],g=fa[u];
if(!isroot(p)){
if((u==s[p][0])^(p==s[g][1])) rotate(p);
else rotate(u);
}
rotate(u);
}
} int getf(int x){return ff[ff[x]]==ff[x]?ff[x]:ff[x]=getf(ff[x]);}
void access(int u){for(int t=0;u;t=u,u=fa[u]) splay(u),s[u][1]=t,update(u);}
void makert(int u){access(u);splay(u);rev[u]^=1;}
void link(int u,int v){makert(u); fa[u]=v;}
void cut(int u,int v){
makert(u); access(v); splay(v);
s[v][0]=fa[u]=0; update(v);
} int query(int u,int v){
makert(u); access(v); splay(v);
return maxv[v];
} int find(int u,int v){
int l=1,r=m,mid;
while(l!=r){
mid=(l+r)>>1;
if(u<a[mid].u || (u==a[mid].u && v<=a[mid].v)) r=mid;
else l=mid+1;
}
return l;
} int main(){
File("a");
n=getint(); m=getint(); q=getint();
for(int i=1;i<=n;i++) ff[i]=i;
for(int i=1;i<=m;i++){
a[i].u=getint(),a[i].v=getint(),a[i].c=getint();
if(a[i].u>a[i].v) swap(a[i].u,a[i].v);
}
sort(a+1,a+m+1,cmp1);
for(int i=1;i<=m;i++) val[i+n]=a[i].c,a[i].id=i;
for(int i=1;i<=q;i++){
b[i].c=getint(),b[i].u=getint(),b[i].v=getint();
if(b[i].u>b[i].v) swap(b[i].u,b[i].v);
if(b[i].c==2) b[i].b=find(b[i].u,b[i].v),a[b[i].b].b=1;
}
sort(a+1,a+m+1,cmp2);
for(int i=1,u,v;i<=m;i++){
if(a[i].b) break;
u=a[i].u; v=a[i].v;
if(getf(u)!=getf(v)){
ff[getf(u)]=getf(v);
link(u,a[i].id+n);
link(v,a[i].id+n);
}
}
sort(a+1,a+m+1,cmp1);
for(int i=q,u,v,t;i;i--){
u=b[i].u,v=b[i].v;
if(b[i].c==1) ans[i]=val[query(u,v)];
else{
if(getf(u)==getf(v)){
t=query(u,v);
if(val[t]>a[b[i].b].c) cut(a[t-n].u,t),cut(a[t-n].v,t);
else continue;
}
link(u,b[i].b+n); link(v,b[i].b+n);
}
}
for(int i=1;i<=q;i++) if(b[i].c==1) printf("%d\n",ans[i]);
return 0;
}
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处,嘟嘟需要为供水公司找到一 ...
随机推荐
- 【BZOJ3772】精神污染 DFS序+主席树
[BZOJ3772]精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
- [算法] N 皇后
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
- pta 习题集 5-2 找出不是两个数组共有的元素 (5分)
给定两个整型数组,本题要求找出不是两者共有的元素. 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数NN(≤20≤20),随后是NN个整数,其间以空格分隔. 输出格式: 在一行中按照数字 ...
- 沈阳网络赛G-Spare Tire【容斥】
17.64% 1000ms 131072K A sequence of integer \lbrace a_n \rbrace{an} can be expressed as: \display ...
- Solutions for common Android development problems with the Eclipse IDE- Tutorial
Table of Contents 1. Solving typical Android development problems 1.1. Clean Project 1.2. android.co ...
- Celery最佳实践(转)
原文:http://my.oschina.net/siddontang/blog/284107 英文原文:https://denibertovic.com/posts/celery-best-prac ...
- SQL Server批量数据导出导入BCP&Bulk使用
数据导出导入,首先考虑使用什么技术实现导出与导入利用BCP结合Bulk技术实现数据的导出与导入 1.bcp数据导出(这里是命令行方式),导出的数据需是格式化的,有两种方式可选 a.对传输的数据格式要求 ...
- mysql 数据操作 单表查询 group by 聚合函数 没有group by情况下
聚合函数只能用在组里使用 #没有group by 则默认算作一组 取出所有员工的最高工资 mysql> select max(salary) from employee; +---------- ...
- android 获取经纬度
android 定位的两种方式:GPS_PROVIDER and NETWORK_PROVIDER 定位的可以借助LocationManager来实现 MainActivity代码 static fi ...
- centos LAMP第三部分php,mysql配置 php配置文件 配置php的error_log 配置php的open_basedir 安装php的扩展模块 phpize mysql配置第二十一节课
centos LAMP第三部分php,mysql配置 php配置文件 配置php的error_log 配置php的open_basedir 安装php的扩展模块 phpize mysql配 ...