题面

初见LCT,动态最小生成树+链上查询max,具体做法是把边转换成点(LCT只能维护点)

时光倒流,先把最后剩的连起来。然后查询就看链上最大值,修改看看链上最大值是否大于当前边,如果是就断开原来的改成当前边

 #include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct a{int x,y,c;}mst[N];
struct b{int x,y,typ;}qry[N];
map<pair<int,int>,int> mmp;
int fth[N],son[N][],val[N];
int maxx[N],stk[N],outp[N];
bool brk[N],rev[N];
int n,m,T,p,t1,t2,cnt,top;
bool cmp(a xx,a yy)
{
return xx.c<yy.c;
}
void Pushup(int nde)
{
maxx[nde]=val[nde];
int &mx=maxx[nde],&mx1=maxx[son[nde][]],&mx2=maxx[son[nde][]];
if(mst[mx1].c>mst[mx].c) mx=mx1; if(mst[mx2].c>mst[mx].c) mx=mx2;
}
void Release(int nde)
{
if(rev[nde])
{
int &lson=son[nde][],&rson=son[nde][];
rev[lson]^=,rev[rson]^=,rev[nde]^=;
swap(lson,rson);
}
}
bool Nottop(int nde)
{
int fa=fth[nde];
return son[fa][]==nde||son[fa][]==nde;
}
void Rotate(int nde)
{
int fa=fth[nde],gr=fth[fa],isl=nde==son[fa][];
if(Nottop(fa)) son[gr][son[gr][]==fa]=nde;
fth[nde]=gr,fth[fa]=nde,fth[son[nde][isl]]=fa;
son[fa][isl^]=son[nde][isl],son[nde][isl]=fa;
Pushup(fa),Pushup(nde);
}
void Splay(int nde)
{
stk[top=]=nde;
for(int i=nde;Nottop(i);i=fth[i])
stk[++top]=fth[i];
while(top) Release(stk[top--]);
while(Nottop(nde))
{
int fa=fth[nde],gr=fth[fa];
if(Nottop(fa))
Rotate(((son[fa][]==nde)==(son[gr][]==fa))?fa:nde);
Rotate(nde);
}
}
void Access(int nde)
{
int lst=,mem=nde;
while(nde)
{
Splay(nde),son[nde][]=lst;
Pushup(nde),lst=nde,nde=fth[nde];
}
Splay(mem);
}
void Turnroot(int nde)
{
Access(nde),rev[nde]^=;
}
int Getroot(int nde)
{
Access(nde);
while(son[nde][])
nde=son[nde][];
return nde;
}
void Split(int x,int y)
{
Turnroot(x),Access(y);
}
int Query(int x,int y)
{
Split(x,y);
return maxx[y];
}
void Link(int x,int y)
{
Turnroot(x);
if(Getroot(y)!=x) fth[x]=y;
}
void Cut(int x,int y)
{
Turnroot(x);
if(Getroot(y)==x&&fth[x]==y&&!son[x][])
son[y][]=fth[x]=;
}
int main()
{
scanf("%d%d%d",&n,&m,&T);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&mst[i].c);
if(t1>t2) swap(t1,t2); mst[i].x=t1,mst[i].y=t2;
}
sort(mst+,mst++m,cmp);
for(int i=;i<=m;i++)
mmp[make_pair(mst[i].x,mst[i].y)]=i;
for(int i=;i<=T;i++)
{
scanf("%d%d%d",&qry[i].typ,&t1,&t2);
if(t1>t2) swap(t1,t2); qry[i].x=t1,qry[i].y=t2;
if(qry[i].typ==) brk[mmp[make_pair(t1,t2)]]=true;
}
for(int i=;i<=m;i++)
val[i+n]=maxx[i+n]=i;
for(int i=;i<=m&&cnt<n-;i++)
if(!brk[i])
{
int tx=mst[i].x,ty=mst[i].y;
Turnroot(tx);
if(Getroot(ty)!=tx)
cnt++,Link(tx,i+n),Link(ty,i+n);
}
for(int i=T;i;i--)
if(qry[i].typ==)
outp[++p]=mst[Query(qry[i].x,qry[i].y)].c;
else
{
int tx=qry[i].x,ty=qry[i].y;
int id=mmp[make_pair(tx,ty)],me=Query(tx,ty);
if(mst[id].c<mst[me].c)
{
Cut(mst[me].x,me+n),Cut(mst[me].y,me+n);
Link(tx,id+n),Link(ty,id+n);
}
}
while(p)
printf("%d\n",outp[p--]);
return ;
}

解题:WC 2006 水管局长的更多相关文章

  1. 数据结构(动态树):COGS 27. [WC 2006] 水管局长

    27. [WC 2006] 水管局长 ★★★☆   输入文件:tube.in   输出文件:tube.out   简单对比时间限制:3 s   内存限制:128 MB [问题描述 ] SC 省 MY ...

  2. [WC 2006]水管局长数据加强版

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

  3. [WC 2006] 水管局长

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2594 [算法] 首先离线 , 将删边操作转化为倒序加边 假设我们已经维护出了一棵最小 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. resize2fs命令详解

    基础命令学习目录首页 原文链接:http://blog.51cto.com/woyaoxuelinux/1870299   resize2fs:调整ext文件系统的空间大小  搭配逻辑卷lv使用方法: ...

  2. iOS静默推送(Silent Remote Notifications)

    此功能是iOS7新增加的功能,允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新. 普通推送:收到推送后(有文字有声音),点开通知,进入APP后,才执行-- ...

  3. 2017年第八届蓝桥杯【C++省赛B组】

    1.标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有 ...

  4. Final阶段中间产物

    空天猎功能说明书:https://git.coding.net/liusx0303/Plane.git 空天猎代码控制:https://coding.net/u/MR__Chen/p/SkyHunte ...

  5. Teamwork#3,Week5,Scrum Meeting 11.20

    到目前为止,第一轮迭代已经基本完成.由于时间问题,多店比较的高级功能要放到第二轮迭代实现. 大部分任务已经完成,在alpha版本发布之前我们剩余需要解决的问题有两个: 服务器.校园网服务器不能满足我们 ...

  6. Scrum Meeting 11.04

    成员 今日任务 明日计划 用时 徐越 学习Fragment相关知识,代码移植 代码移植 4h 赵庶宏 selvet移植,服务器配置,编写数据库 服务器配置,代码移植 4h 薄霖 学习安卓界面设计数据库 ...

  7. 第二阶段Sprint冲刺会议2

     进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写. 

  8. ORACLE_SQL

    --建立学生表create table Student (       Sno char(9) primary key,       Sname char(20)unique,       Sex  ...

  9. model类的构造部分属性的对象 产生的json

    在 action方法里, 产生一个对象,可能会是默认的全属性对象,那么在输出的 json就又所有 都出现了. 只是其他的属性全部是 null 那么 在 json里面配上 <!-- json 不产 ...

  10. Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)

    一 基础知识 字节  8位半字  16位字    32位 二 解惑 Code, RO-data,RW-data,ZI-data Code为程序代码部分RO-data 表示 程序定义的常量const t ...