http://www.lydsy.com/JudgeOnline/problem.php?id=2594 (题目链接)

题意

  给出一个带边权的无向简单,要求维护两个操作,删除${u,v}$之间的连边;求${u,v}$之间某条路径使路径上的权值最大边最小。

Solution

  我们把询问倒过来做,于是删边就变成了加边,然后就可以LCT啦。

  mdzz卡了一上午常数,下面讲一讲我卡常数的心得→_→:

  1.pushdown写成非递归的

  2.初始连边时一定要写克鲁斯卡尔,而不是直接LCT维护删边加边

  3.find函数用并查集写

  4.不要用STL的stack。。。

  5.inline加上

  6.读入优化

  7.因为保证任何时刻图连通,所以我们对询问进行操作时,加入的边的两个端点一定在同一连通块内,于是省去了2次find→_→

代码

// bzoj2594
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf (1ll<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline int gi() {
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=100010,maxm=1100010;
int a[maxm],mx[maxm],fa[maxm],tr[maxm][2],rev[maxm],ans[maxn],vis[maxm];
int n,m,Q,f[maxm],st[maxm]; struct ask {int k,x,y,id;}q[maxn];
struct edge {int u,v,w,id;}e[maxm]; inline bool cmp1(edge a,edge b) {return a.u==b.u ? a.v<b.v : a.u<b.u;}
inline bool cmp2(edge a,edge b) {return a.w<b.w;}
inline bool cmp3(edge a,edge b) {return a.id<b.id;} inline void pushup(int x) {
if (a[mx[tr[x][0]]]>a[mx[tr[x][1]]]) mx[x]=mx[tr[x][0]];
else mx[x]=mx[tr[x][1]];
if (a[x]>a[mx[x]]) mx[x]=x;
}
inline void pushdown(int x) {
st[0]=0;
while (tr[fa[x]][0]==x || tr[fa[x]][1]==x) st[++st[0]]=x,x=fa[x];
st[++st[0]]=x;
for (int i=st[0];i>=1;i--) {
x=st[i];
if (rev[x]) {
swap(tr[x][0],tr[x][1]);
rev[tr[x][0]]^=1;rev[tr[x][1]]^=1;rev[x]^=1;
}
}
}
inline void rotate(int x) {
int y=fa[x],z=fa[y],l,r;
l=tr[y][1]==x;r=l^1;
if (tr[z][0]==y || tr[z][1]==y) tr[z][tr[z][1]==y]=x;
fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
tr[y][l]=tr[x][r];tr[x][r]=y;
pushup(y);pushup(x);
}
inline void splay(int x) {
pushdown(x);
while (tr[fa[x]][0]==x || tr[fa[x]][1]==x) {
int y=fa[x],z=fa[y];
if (tr[z][0]==y || tr[z][1]==y) {
if (tr[z][0]==y ^ tr[y][0]==x) rotate(x);
else rotate(y);
}
rotate(x);
}
}
inline void access(int x) {
for (int y=0;x;y=x,x=fa[x])
splay(x),tr[x][1]=y,pushup(x);
}
inline void makeroot(int x) {
access(x);splay(x);rev[x]^=1;
}
inline void link(int x,int y) {
makeroot(x);fa[x]=y;
}
inline void cut(int x,int y) {
makeroot(x);access(y);splay(y);
tr[y][0]=fa[x]=0;pushup(y);
}
inline int query(int x,int y) {
makeroot(x);access(y);splay(y);
return mx[y];
}
inline int find(int x) {
return f[x]==x ? x : f[x]=find(f[x]);
}
inline int Lower_bound(int x,int y) {
int l=1,r=m,res;
while (l<=r) {
int mid=(l+r)>>1;
if (x<e[mid].u || (x==e[mid].u && y<=e[mid].v)) res=mid,r=mid-1;
else l=mid+1;
}
return e[res].id;
}
int main() {
n=gi(),m=gi(),Q=gi();
for (int i=1;i<=m;i++) {
e[i].u=gi(),e[i].v=gi(),e[i].w=gi(),e[i].id=i;
if (e[i].u>e[i].v) swap(e[i].u,e[i].v);
}
sort(e+1,e+1+m,cmp1);
for (int i=1;i<=Q;i++) {
q[i].k=gi(),q[i].x=gi(),q[i].y=gi();
if (q[i].x>q[i].y) swap(q[i].x,q[i].y);
if (q[i].k==2) q[i].id=Lower_bound(q[i].x,q[i].y),vis[q[i].id]=1;
}
sort(e+1,e+1+m,cmp2);
for (int i=1;i<=n+m;i++) a[i]=0,f[i]=i;
for (int i=1;i<=m;i++) if (!vis[e[i].id]) {
a[n+e[i].id]=e[i].w;
int r1=find(e[i].u),r2=find(e[i].v);
if (r1!=r2) {
link(e[i].u,n+e[i].id),link(e[i].v,n+e[i].id);
f[r1]=r2;
}
}
sort(e+1,e+1+m,cmp3);
for (int i=Q;i>=1;i--) {
if (q[i].k==1) ans[i]=a[query(q[i].x,q[i].y)];
else {
int t=q[i].id;
a[t+n]=e[t].w;
int xx=query(e[t].u,e[t].v);
if (a[xx]<=a[n+t]) continue;
cut(e[xx-n].u,xx),cut(e[xx-n].v,xx);
link(e[t].u,n+t),link(e[t].v,n+t);
}
}
for (int i=1;i<=Q;i++) if (q[i].k==1) printf("%d\n",ans[i]);
return 0;
}

【bzoj2594】 Wc2006—水管局长数据加强版的更多相关文章

  1. BZOJ2594: [Wc2006]水管局长数据加强版

    题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...

  2. [bzoj2594][Wc2006]水管局长数据加强版 (lct)

    论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...

  3. BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】

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

  4. BZOJ2594 [Wc2006]水管局长数据加强版 LCT kruskal

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2594 题意概括 N个点的图,M条带权边.(N<=100000,M<=1000000) ...

  5. [BZOJ2594] [Wc2006]水管局长数据加强版(LCT + kruskal + 离线)

    传送门 WC这个题真是丧心病狂啊,就是想学习一下怎么处理边权,给我来了这么一个破题! ORZ hzwer 临摹黄学长代码233 但还是复杂的一匹 理一下思路吧 题目大意:给定一个无向图,多次删除图中的 ...

  6. 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了 ...

  7. [bzoj2594][Wc2006]水管局长数据加强版——lct+离线

    Brief Description 您有一个无向带权图,您需要支持两种操作. 询问两个点之间的最大权最小路径. 删除一条边. Algorithm Design 我们首先提出一个猜想:最优路径一定在原图 ...

  8. bzoj2594 [Wc2006]水管局长数据加强版——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2594 时间倒序一下,就是 魔法森林 那道题: 有个不解的地方,是 access 里面关于 p ...

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

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

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

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

随机推荐

  1. 004 --Mysql中的锁的问题

    死锁 死锁是指两个或多个事务在同一个资源上相互占用, 并请求锁定对方占用的资源, 从而导致恶性循环的现象. 当多个事务试图以不同顺序锁定资源时, 就可能产生死锁.死锁发生以后, 只有部分或者完全回滚其 ...

  2. OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?

    版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...

  3. Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据

    博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...

  4. nginx 在ubuntu上使用笔记(绑定域名)

    1. 重启nginx的两个语句: sudo service nginx restart sudo nginx -s reload 2. nginx配置文件路径: etc/nginx/ 尤其是 site ...

  5. jenkins配置01--用户添加及权限配置

    原文出自:https://www.cnblogs.com/kevingrace/p/6019707.html 下面重点记录下jenkins安装后的一些配置: (1)添加用户权限 jenkins初次登陆 ...

  6. spring冲刺第二天

    昨天查找了安卓开发的相关资料以及炸弹人游戏的资料. 由于今天课程比较多,只在晚上将安卓开发环境配置完成. 在安装软件时环境配置出现了问题,不过问过同学后成功解决.

  7. Java script 中的面向对象1

    Java script 中的面向对象 对象 对象是Javascript的基本数据类型,对象是一种复合值,将很多的键值对聚合在一起使用.对象可看做是属性的无序集合,每个属性都是一个名/值对.属性名其实是 ...

  8. C++ MOOC

    相关课程列表: C++远征之起航篇 C++远征之离港篇 C++远征之封装篇 上 C++远征之封装篇 下 C++远征之继承篇 C++远征之多态篇 授课老师:james_yuan 在寒假,我主要选择 C+ ...

  9. Unity删除或更换天空盒

    Unity版本:5.6.2 点击菜单栏Window-->Lighting-->Settings 在弹出的窗口中,设置Skybox Material选项,从原来的默认天空盒更换成别的,或者选 ...

  10. nginx使用“sudo service nginx start”启动报错解决方案

    下载nginx的启动脚本: # wget -O init-deb.sh http://library.linode.com/assets/660-init-deb.sh 将脚本添加到init.d目录和 ...