P4172 [WC2006]水管局长
P4172 [WC2006]水管局长
前言
luogu数据太小
去bzoj,他的数据大一些
思路
正着删不好维护
那就倒着加,没了
LCT维护他的最小生成树MST
树上加一条边肯定会有一个环
看看环上最大值和加边的大小
然后选择加不加,改不改
错误
哇,恶心撒
怼着题解都写不出来
最后乱改了一下就A了???
代码
// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define ls ch[x][0]
#define rs ch[x][1]
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int N=1e6+7;
const int inf=0x3f3f3f3f;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,qwq,ans[N];
map<int,int> MVP[N];
//MVP[1200][1200]; luogu
struct node {
int u,v,q,id;
bool operator < (const node &b) const {
return q<b.q;
}
}G[N];
map<pair<int,int>,int> mdzz;
struct query {
int opt,x,y,id;
}Q[N];
int f[N],ch[N][2],s[N],lazy[N];
int val[N];
void pushup(int x) {
s[x]=x;
if(val[s[ls]] > val[s[x]]) s[x]=s[ls];
if(val[s[rs]] > val[s[x]]) s[x]=s[rs];
}
void tag(int x) {
swap(ls,rs);
lazy[x]^=1;
}
bool isroot(int x) {
return ch[f[x]][0]==x || ch[f[x]][1]==x;
}
void pushdown(int x) {
if(lazy[x]) {
if(ls) tag(ls);
if(rs) tag(rs);
lazy[x]=0;
}
}
void rotate(int x) {
int y=f[x],z=f[y],k=ch[y][1]==x,m=ch[x][k^1];
if(isroot(y)) ch[z][ch[z][1]==y]=x;
ch[x][k^1]=y;
ch[y][k]=m;
if(m) f[m]=y;
f[x]=z;
f[y]=x;
pushup(y);
}
int q[N];
void splay(int x) {
int y=x,z=0;
q[++z]=y;
while(isroot(y)) q[++z]=y=f[y];
while(z) pushdown(q[z--]);
while(isroot(x)) {
y=f[x],z=f[y];
if(isroot(y)) (ch[y][1]==x)^(ch[z][1]==y) ? rotate(x) : rotate(y);
rotate(x);
}
pushup(x);
}
void access(int x) {
for(int y=0;x;y=x,x=f[x])
splay(x),rs=y,pushup(x);
}
void makeroot(int x) {
access(x);
splay(x);
tag(x);
}
int findroot(int x) {
access(x);
splay(x);
while(ls) pushdown(x),x=ls;
return x;
}
int split(int x,int y) {
makeroot(x);
access(y);
splay(y);
return s[y];
}
void link(int x,int y) {
makeroot(x);
if(findroot(y)!=x) f[x]=y;
}
void cut(int x,int y) {
makeroot(x);
if(findroot(y)==x&&f[x]==y&&!ch[x][1]) {
f[x]=ch[y][0]=0;
pushup(y);
}
}
int suanle_f[N],suanle_siz[N];
int suanle_find(int x) {
return suanle_f[x]==x ? x : suanle_f[x]=suanle_find(suanle_f[x]);
}
void suanle_uu(int x,int y) {
int fx=suanle_find(x),fy=suanle_find(y);
if(suanle_siz[fx] <= suanle_siz[fy]) {
suanle_f[fx]=fy;
if(suanle_siz[fx]==suanle_siz[fy]) suanle_siz[fy]++;
} else {
suanle_f[fy]=fx;
}
}
int main() {
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
n=read(),m=read(),qwq=read();
FOR(i,1,m) suanle_f[i]=i;
FOR(i,1,m) {
G[i].u=read(),G[i].v=read(),G[i].q=read();
if(G[i].u>G[i].v)swap(G[i].u,G[i].v);
}
sort(G+1,G+1+m);
FOR(i,1,m) val[i+n]=G[i].q,mdzz[make_pair(G[i].u,G[i].v)]=i,s[n+i]=n+i;
FOR(i,1,qwq) {
Q[i].opt=read(),Q[i].x=read(),Q[i].y=read();
if(Q[i].x>Q[i].y)swap(Q[i].x,Q[i].y);
if(Q[i].opt==2) {
Q[i].id=mdzz[make_pair(Q[i].x,Q[i].y)];
MVP[Q[i].x][Q[i].y]=1;
}
}
FOR(i,1,m) val[i+n]=G[i].q;
int js=0;
FOR(i,1,m) {
if(MVP[G[i].u][G[i].v]==1) continue;
if(suanle_find(G[i].u)==suanle_find(G[i].v)) continue;
link(G[i].u,i+n);
link(G[i].v,i+n);
suanle_uu(G[i].u,G[i].v);
js++;
if(js==n-1) break;
}
for(int i=qwq;i>=1;--i) {
int x=Q[i].x,y=Q[i].y;
if(Q[i].opt==1) {
int tmp=split(x,y);
ans[i]=val[tmp];
} else {
int tmp=split(x,y);
if(val[tmp] > G[Q[i].id].q) {
cut(G[tmp-n].u,tmp);
cut(G[tmp-n].v,tmp);
link(x,Q[i].id+n);
link(y,Q[i].id+n);
}
}
}
FOR(i,1,qwq) if(Q[i].opt==1) cout<<ans[i]<<"\n";
return 0;
}
P4172 [WC2006]水管局长的更多相关文章
- P4172 [WC2006]水管局长(LCT)
P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...
- 洛谷P4172 [WC2006]水管局长(lct求动态最小生成树)
SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径, ...
- P4172 [WC2006]水管局长 LCT维护最小生成树
\(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...
- luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线
Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...
- [洛谷P4172] WC2006 水管局长
问题描述 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水 ...
- 洛谷P4172 [WC2006]水管局长 (LCT,最小生成树)
洛谷题目传送门 思路分析 在一个图中,要求路径上最大边边权最小,就不难想到最小生成树.而题目中有删边的操作,那肯定是要动态维护啦.直接上LCT维护边权最小值(可以参考一下蒟蒻的Blog) 这时候令人头 ...
- Luogu P4172 [WC2006]水管局长
题意 给定一个 \(n\) 个点 \(m\) 条边的图和 \(q\) 次操作,每次操作分为以下两种: 1 u v:查询 \(u\) 到 \(v\) 的一条路径使得边权最大的边的权值最小. 2 u v: ...
- BZOJ2594: [Wc2006]水管局长数据加强版
题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...
- bzoj 2594: [Wc2006]水管局长数据加强版 动态树
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
随机推荐
- 将Web项目War包部署到Tomcat服务器基本步骤
参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识: 1.1 War包 War包一般是在进行Web ...
- hessian 在spring中的使用 (bean 如 Dao无法注入的问题)
hessian的主要结构分客户端与服务端,中间基于http传输.客户端主要做的事情是把对远程接口调用序列化为流,并传输到服务端:服务端主要做的事情是把传输过来的流反序列化为对服务的请求,调用相应服务后 ...
- db2字符串相关函数的使用
db2字符串相关函数的使用 from :internet 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来 ...
- hdu5064 DLX可重复覆盖+二分
这题题意是 给了n个城市 在其中小于等于k个城市建立机场然后 使得最远的那个离机场的城市距离最短 二分答案 ,我们对于每次的mid 重新建图然后再来一次DLX,每个点可以覆盖的点建立一条联系就ok了 ...
- jQuery选择器--#id、element和.class
#id 描述 根据给定的ID匹配一个元素.使用任何的元字符作为名称的文本部分, 它必须被两个反斜杠转义:\\ 参数 id 用于搜索的,通过元素的 id 属性中给定的值 element 概述 根 ...
- [openjudge-动态规划]买书
题目描述 描述 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元.问小明有多少种买书方案?(每种书可购买多本) 输入 一个整数 n,代表总共钱数.(0 <= n < ...
- 【Redis学习之六】Redis数据类型:集合和有序集合
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.集合 Set无序的.去重的元素 ...
- django之路由分析
URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. URLconf配置 基本格式: from django.conf.urls i ...
- flask模板应用-自定义错误页面
自定义错误页面 当程序返回错误响应时,会渲染一个默认的错误页面,我们可以注册错误处理函数来处理错误页面 错误处理函数和视图函数很相似,返回值将作为响应的主题,因此我们先要创建错误页面的模板文件.为了和 ...
- css的优先级 和 权重
之前写页面样式时,有时会遇到 用多条样式定义规则对同一个元素进行样式设置的时候,当时想到的就是 按css选择器的优先级来搞定这个问题,说实话当时也就只记得 内嵌样式 > id > cla ...