题目链接

戳我

\(Solution\)

这道题实际上是维护一个最小生成树,因为正的搞不好搞,所以反着搞会比较好,现将没有没删掉的边留下来生成一颗最小生成树,再加边就好了,现在\(LCT\)

来看看怎么维护

对于一个最小生成树,加一条边后会是一个环,在环上删掉一个最大的边,还是一个最小生成树。所以我们对于加边只要判断这条边和最小生成树上最大边的大小,如果小于,则将这条边加入,原最小生成树上最大的边删除,如果大于不需要管他。

但是\(LCT\)只能维护点权,不能维护边权,不妨将这个边看成点即可

加入\((x,y)的边\)就是\(link(x,id),link(y,id),id\)为这条边的编号

\(cut\)同理

\(Code\)

#include<bits/stdc++.h>
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node {
int fa,v,lazy,ch[2];
}a[1100001];
int v[1100001],pre[100001];
map<int,int> f[100001];
int vis[1000001];
inline bool nroot(int x){
return a[a[x].fa].ch[0]==x||a[a[x].fa].ch[1]==x;
}
inline int max(int x,int y){
return v[x]>v[y]?x:y;
}
inline void pushup(int x){
a[x].v=max(a[a[x].ch[0]].v,max(a[a[x].ch[1]].v,x));
}
inline void work(int x){
int t=a[x].ch[0];
a[x].ch[0]=a[x].ch[1],a[x].ch[1]=t,a[x].lazy^=1;
}
inline void pushdown(int x){
if(a[x].lazy)
work(x),a[a[x].ch[0]].lazy^=1,a[a[x].ch[1]].lazy^=1;
}
inline void rotate(int x){
int y=a[x].fa,z=a[y].fa,k=(a[y].ch[1]==x);
if(nroot(y)) a[z].ch[a[z].ch[1]==y]=x;
a[x].fa=z,a[y].ch[k]=a[x].ch[k^1],a[a[x].ch[k^1]].fa=y;
a[x].ch[k^1]=y,a[y].fa=x;
pushup(x),pushup(y);
}
inline void down(int x){
if(nroot(x)) down(a[x].fa);
pushdown(x);
}
inline void splay(int x){
down(x);
while(nroot(x)){
int y=a[x].fa,z=a[y].fa;
if(nroot(y))
(a[y].ch[1]==x)^(a[z].ch[1]==y)?rotate(x):rotate(y);
rotate(x);
}
pushup(x);
}
inline void access(int x){
int y=0;
while(x) splay(x),a[x].ch[1]=y,pushup(y=x),x=a[x].fa;
}
inline void makeroot(int x){
access(x),splay(x),a[x].lazy^=1;
}
inline void splix(int x,int y){
makeroot(x),access(y),splay(y);
}
inline int findroot(int x){
access(x),splay(x);
while(a[x].ch[0]) pushdown(x),x=a[x].ch[0];
splay(x);
return x;
}
inline void link(int x,int y){
makeroot(x);
if(findroot(y)!=x)
a[x].fa=y;
}
inline void cut(int x,int y){
makeroot(x);
if(findroot(y)!=x||a[y].fa!=x||a[y].ch[0]) return ;
a[y].fa=a[x].ch[1]=0,pushup(x);
}
struct node1{
int x,y,z;
}b[1000001];
inline bool cmp(const node1 & a , const node1 & b ){
return a.z<b.z;
}
inline int find(int x){
return pre[x]==x?x:pre[x]=find(pre[x]);
}
int X[100001],Y[100001],opt[100001],n,m,q,ans[100001],tot;
inline void MST(){
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=m;i++){
int fx=find(b[i].x),fy=find(b[i].y);
if(!vis[i]&&fx!=fy)
link(b[i].x,i+n),link(b[i].y,i+n),pre[fx]=fy;
}
}
int main(){
n=read(),m=read(),q=read();
for(rg int i=1;i<=m;i++)
b[i].x=read(),b[i].y=read(),b[i].z=read();
sort(b+1,b+1+m,cmp);
for(rg int i=1;i<=m;i++)
f[b[i].x][b[i].y]=f[b[i].y][b[i].x]=i+n,v[i+n]=b[i].z;
for(rg int i=1;i<=q;i++){
opt[i]=read(),X[i]=read(),Y[i]=read();
if(opt[i]==2) vis[f[X[i]][Y[i]]-n]=1;
}
MST();
for(rg int i=q;i>=1;i--){
splix(X[i],Y[i]);
if(opt[i]==1)
ans[++tot]=v[a[Y[i]].v];
else{
if(v[a[Y[i]].v]>v[f[X[i]][Y[i]]]){
int x=a[Y[i]].v;
cut(b[x-n].x,x),cut(b[x-n].y,x),link(X[i],f[X[i]][Y[i]]),link(Y[i],f[X[i]][Y[i]]);
}
}
}
for(rg int i=tot;i>=1;i--)
printf("%d\n",ans[i]);
return 0;
}

「WC2006」水管局长的更多相关文章

  1. 【BZOJ2594】【WC2006】水管局长

    日……又被傻B错坑了一整天…… 原题: SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要 ...

  2. BZOJ 2594 【WC2006】 水管局长数据加强版

    题目链接:水管局长数据加强版 好久没写博客了…… 上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手. 首先,LCT这里不讲.这道题要求支持动态 ...

  3. 【BZOJ】【2594】【WC2006】水管局长数据加强版

    LCT 动态维护MST嘛……但是有删边= =好像没法搞的样子 离线记录所有修改&询问,倒序处理,就可以变删边为加边了- 论如何用LCT维护最小生成树:先搞出一棵最小生成树,然后每次加边(u,v ...

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

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

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

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

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

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

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

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

  8. BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]

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

  9. BZOJ_2594_[Wc2006]水管局长数据加强版_LCT

    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...

随机推荐

  1. Go语言环境安装详细介绍

    工具链介绍 go有两套编译工具链,分别是从plant9移植过来的gc和依赖gcc的gccgo. 官方为gc工具链提供了二进制安装包和源码, 可以根据需要选择一种安装方式.gc工具链对操作系统和CPU类 ...

  2. Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

    1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model; import java.util.Date; ...

  3. WordPress无法发送电子邮件,可能原因:您的主机禁用了mail()函数解决方案

    体验更优排版请移步原文:http://blog.kwin.wang/website/wp-cant-send-email-solution.html 最近折腾了下WordPress,给米表 搭了个论坛 ...

  4. Delphi7 [Fatal Error] ClassPas.pas(8): File not found: 'DesignIntf.dcu'

    Delphi7 [Fatal Error] ClassPas.pas(8): File not found: 'DesignIntf.dcu' Add path to Project>Optio ...

  5. Overcoming Life's Obstacles - ASC 2017 March 03

    Overcoming Life's Obstacles - How a top oboist overcame a neurological disorder to play again ©Advan ...

  6. ubuntu17.10 安装CUDA

    1. 更新apt-get源列表 sudo apt-get update sudo apt-get upgrade 2. 添加驱动源 sudo add-apt-repository ppa:graphi ...

  7. 40. Combination Sum II (Back-Track)

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  8. VUE递归树形目录(vue递归组件)的使用

    1.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  9. 修改数据库的instance_name和db_name

    分成两个步骤,先修改instance_name,在修改db_name 修改SID1.全备份数据库RMAN> backup as compressed backupset database inc ...

  10. NoSQL数据库笔谈

    NoSQL数据库笔谈 databases , appdir , node , paper颜开 , v0.2 , 2010.2 序 思想篇 CAP 最终一致性 变体 BASE 其他 I/O的五分钟法则 ...