洛谷4172 WC2006水管局长(LCT维护最小生成树)
这个题和魔法森林感觉有很相近的地方啊
同样也是维护一个类似最大边权最小的生成树
但是不同的是,这个题是有\(cut\)和询问,两种操作....
这可如何是好啊?
我们不妨倒着来考虑,假设所有要\(cut\)的边全都不存在,倒序做这个问题,不就是相当于在支持\(link\)操作吗?
那么就和之前的问题大致上是一样的了
对于\(u->v\)
如果\(findroot(u)!=findroot(v)\),就直接连边。
如果\(findroot(u)==findroot(v)\),就判断原来两个点之间的路径的最大值是不是大于当前值,如果大于就替换
直接上代码
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#define mk make_pair
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 4e5+1e2;
struct Node{
int opt;
int x,y;
};
int ch[maxn][3];
int siz[maxn];
int fa[maxn];
int mx[maxn],mxpos[maxn];
int n,m;
int rev[maxn];
map<pair<int,int>,int> mp;
int q;
int x[maxn],y[maxn],w[maxn];
int val[maxn];
Node ymh[maxn];
int son(int x)
{
if (ch[fa[x]][0]==x) return 0;
else return 1;
}
bool notroot(int x)
{
return ch[fa[x]][0]==x || ch[fa[x]][1]==x;
}
void update(int x)
{
mx[x]=val[x];
mxpos[x]=x;
if (ch[x][0])
{
if (mx[ch[x][0]]>mx[x])
{
mx[x]=mx[ch[x][0]];
mxpos[x]=mxpos[ch[x][0]];
}
}
if (ch[x][1])
{
if (mx[ch[x][1]]>mx[x])
{
mx[x]=mx[ch[x][1]];
mxpos[x]=mxpos[ch[x][1]];
}
}
}
void reverse(int x)
{
swap(ch[x][0],ch[x][1]);
rev[x]^=1;
}
void pushdown(int x)
{
if (rev[x])
{
if (ch[x][0]) reverse(ch[x][0]);
if (ch[x][1]) reverse(ch[x][1]);
rev[x]=0;
}
}
void rotate(int x)
{
int y=fa[x],z=fa[y];
int b=son(x),c=son(y);
if (notroot(y)) ch[z][c]=x;
fa[x]=z;
ch[y][b]=ch[x][!b];
fa[ch[x][!b]]=y;
ch[x][!b]=y;
fa[y]=x;
update(y);
update(x);
}
int st[maxn];
void splay(int x)
{
int y=x,cnt=0;
st[++cnt]=y;
while (notroot(y)) y=fa[y],st[++cnt]=y;
while (cnt) pushdown(st[cnt--]);
while (notroot(x))
{
int y=fa[x],z=fa[y];
int b=son(x),c=son(y);
if (notroot(y))
{
if (b==c) rotate(y);
else rotate(x);
}
rotate(x);
}
update(x);
}
void access(int x)
{
for (int y=0;x;y=x,x=fa[x])
{
splay(x);
ch[x][1]=y;
update(x);
}
}
void makeroot(int x)
{
access(x);
splay(x);
reverse(x);
}
int findroot(int x)
{
access(x);
splay(x);
while (ch[x][0])
{
pushdown(x);
x=ch[x][0];
}
return x;
}
void split(int x,int y)
{
makeroot(x);
access(y);
splay(y);
}
void link(int x,int y)
{
makeroot(x);
if (findroot(y)!=x) fa[x]=y;
}
void cut(int x,int y)
{
split(x,y);
if (ch[x][0] || ch[x][1] || fa[x]!=y || ch[y][son(x)^1]) return;
fa[x]=ch[y][0]=0;
}
int vis[maxn];
int ans[maxn];
int main()
{
n=read(),m=read(),q=read();
for (int i=1;i<=m;i++)
{
x[i]=read(),y[i]=read(),w[i]=read();
val[i+n]=w[i];
mp[mk(x[i],y[i])]=mp[mk(y[i],x[i])]=i;
}
for (int i=1;i<=q;i++)
{
ymh[i].opt=read();
ymh[i].x=read();
ymh[i].y=read();
if (ymh[i].opt==2) vis[mp[mk(ymh[i].x,ymh[i].y)]]=1;
}
for (int i=1;i<=m;i++)
{
if (vis[i]) continue;
if (findroot(x[i])!=findroot(y[i]))
{
link(x[i],i+n);
link(y[i],i+n);
mp[mk(x[i],y[i])]=mp[mk(y[i],x[i])]=i+n;
}
else
{
split(x[i],y[i]);
int now =mxpos[y[i]];
if (mx[y[i]]<w[i]) continue;
cut(x[now-n],now);
cut(y[now-n],now);
mp[mk(x[now-n],y[now-n])]=mp[mk(y[now-n],x[now-n])]=0;
link(x[i],i+n);
link(y[i],i+n);
mp[mk(x[i],y[i])]=mp[mk(y[i],x[i])]=i+n;
}
}
int tmp=0;
for (int j=q;j>=1;j--)
{
if (ymh[j].opt==1)
{
split(ymh[j].x,ymh[j].y);
ans[++tmp]=mx[ymh[j].y];
//printf("%d\n",mx[ymh[j].y]);
}
else
{
int i=mp[mk(ymh[j].x,ymh[j].y)];
if (findroot(x[i])!=findroot(y[i]))
{
link(x[i],i+n);
link(y[i],i+n);
//mp[mk(x[i],y[i])]=mp[mk(y[i],x[i])]=i+n;
}
else
{
split(x[i],y[i]);
int now =mxpos[y[i]];
if (mx[y[i]]<val[i+n]) continue;
cut(x[now-n],now);
cut(y[now-n],now);
//mp[mk(x[now-n],y[now-n])]=mp[mk(y[now-n],x[now-n])]=0;
link(x[i],i+n);
link(y[i],i+n);
//mp[mk(x[i],y[i])]=mp[mk(y[i],x[i])]=i+n;
}
}
}
for (int i=tmp;i>=1;i--)
{
printf("%d\n",ans[i]);
}
return 0;
}
洛谷4172 WC2006水管局长(LCT维护最小生成树)的更多相关文章
- 洛谷.4172.[WC2006]水管局长(LCT Kruskal)
题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...
- 洛谷 4172 [WC2006]水管局长
[题解] 我们把操作倒过来做,就变成了加边而不是删边.于是用LCT维护动态加边的最小生成树就好了.同样要注意把边权变为点权. #include<cstdio> #include<al ...
- P4172 [WC2006]水管局长 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...
- [洛谷P4172] WC2006 水管局长
问题描述 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水 ...
- 洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)
洛谷题目传送门 思路分析 在一个图中,要求路径上最大边边权最小,就不难想到最小生成树.而题目中有删边的操作,那肯定是要动态维护啦.直接上LCT维护边权最小值(可以参考一下蒟蒻的Blog) 这时候令人头 ...
- 洛谷P4172 [WC2006]水管局长(lct求动态最小生成树)
SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径, ...
- luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线
Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...
- 【洛谷P4172】水管局长
题目大意:给定 N 个点,M 条边的无向图,支持两种操作:动态删边和查询任意两点之间路径上边权的最大值最小是多少. 题解: 引理:对原图求最小生成树,可以保证任意两点之间的路径上边权的最大值取得最小值 ...
- P4172 [WC2006]水管局长(LCT)
P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...
随机推荐
- 树莓派4B切换国内源-亲测有效
参考:https://blog.csdn.net/qq_30290661/article/details/103386997 修改/etc/apt/sources.list,去掉自带的源,添加如下源: ...
- 修改python import模块中的变量
可以直接通过 模块名.变量名=xx 的方式修改模块中的全局变量,测试代码如下 模块:test_model.py x = 111 def inc_x(): global x x = x + 1 测试脚本 ...
- MySQL-表迁移工具的选型-xtrabackup的使用
1.1. 场景 有的时候test人员可能需要在测试库上比较新的数据,这时候只能是从生产库上面去那了.如果是小表还好实用mysqldump/mysqlpump就可以轻松的解决.但是,如果遇到了大表这将是 ...
- elasticsearch支持大table格式数据的搜索
一.问题源起 数据情况 TableMeta, 保存table的元数据,通过fileId关联具体的GridFS文件: id name creator fileId 1 table1 mango f1 2 ...
- 性能测试工具JMeter 基础(七)—— 测试元件: 逻辑控制器之if逻辑控制器
逻辑控制器线程组指定了其取样器执行的逻辑条件.顺序,并且执行顺序是按照位置顺序从上至下执行的 if逻辑控制器(If Controller) 在逻辑控制器中可设置条件,当条件满足的时候才会被执行 一共有 ...
- WEB漏洞——CSRF、SSRF
CSRF漏洞 CSRF( Cross- site request forgery,跨站请求伪造)也被称为 One Click Attack或者 Session Riding,通常缩写为CSRF或者XS ...
- Nginx:多项目开发配置跨域代理
简述Nginx应用场景(前后端) 当我们开发 vue 项目中可以通过 proxyTable 进行跨域,但如果是原生的 html+css+js ,或者其他没有跨域插件的项目中,想要跨域就要引入配置许多的 ...
- Git:git commit时退出报错解决(Error45、Error325)
Git 报错 在输入git commit编辑注释日志时强制退出git程式,文件会变成只读文件,于是出现下述报错: 解决方法(ERROR45) 我们提交代码的正常操作流程一般是: 输入git commi ...
- 前后端数据交互(八)——请求方法 GET 和 POST 区别
WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...
- .NET 6 RC1 正式发布
昨天晚上微软发布了.NET 6的两个RC版本中的第一个版本,该版本将于11月正式发布,作为在开源MIT协议下整合所有不同的.NET开发模组件的开源跨平台实现.这是一个从2014年开始,持续多年的,以改 ...