题意:

给出一张n节点、m条代权无向边的无向联通图 和q个任务

1:询问一条x到y的路径 并使路径上最大权值最小 要求输出路径上最大权值

2:宣布x到y的路径报废题目保证该图永远联通

题解:

这是道凶残的题目 用了我一整天的时间

虽然AK大神表示这是模板题看到最大权值最小 可能会想到二分(其实我是写题解的时候才想到的 因为大表讲课的时候讲过怎么做)

但是好像二分不好判断是否可行 要判断貌似要O(m)的时间 对这个庞大的数据是很难A的于是

我们可以倒着来做 从最后一个任务开始

显然 若是要x到y最大值最小 就要保证图为最小生成树 并用动态树维护 路径上的最大值

任务1就直接从动态树上取答案

任务2 就添加一个水管 为了保证是最小生成树 算出x到y的最大值

如果比当前水管权值大 那么删掉最大的那个水管 并且link(x,y)

这题目虽然给了25s的时限 但是它竟然连输入都要优化 可见卡时卡得多凶残 这也体现了打动态树要打好常数的重要性

这题我TLE了一晚上 打了AK大神说的二分优化 但是还是T 当时已经快崩溃了 打了一天就做了一题还TLE(不难发现我后面的代码二分用的是wtf - -) 一气之下往全部函数前面加了个inline 又交了一次 本来不打算A的 但是它竟然过了 而且还是26s过的... 反正它是显示accept了... 话说JY大神优化了一晚上 刷到了第三名 9s!orz

代码:

 #include <cstdio>
#include <map>
#include <algorithm>
using std::sort;
using std::map;
struct info{
int lc,rc,fat,max,key,tag,root;
info(const int a=,const int b=,const int c=,const int d=,const int e=,const int f=,const int g=):
lc(a),rc(b),fat(c),max(d),key(e),tag(f),root(g){}
}tree[];
struct inli{
int x,y,lll;
inli(const int a=,const int b=,const int c=):
x(a),y(b),lll(c){}
}line[],ask[];
inline bool operator <(inli a,inli b){
return a.x<b.x || (a.x==b.x && a.y<b.y);
}
//map<inli,int> ma;
int n,m,q,nn,nb,lon[],bo[],ans[],na,ma[];
inline void clean(){
tree[]=info(,,,,,,);
}
inline void swap(int &a,int &b){
int x=a;
a=b,b=x;
}
inline void pushdown(int t){
if (tree[t].tag){
tree[t].tag=;
tree[tree[t].lc].tag^=;
tree[tree[t].rc].tag^=;
swap(tree[t].lc,tree[t].rc);
}
clean();
}
inline void maintain(int t){
tree[t].max=t;
int ll=tree[t].lc,rr=tree[t].rc;
if (tree[tree[ll].max].key>tree[tree[t].max].key) tree[t].max=tree[ll].max;
if (tree[tree[rr].max].key>tree[tree[t].max].key) tree[t].max=tree[rr].max;
}
inline void left(int t){
int fa=tree[t].fat,r=tree[t].rc;
tree[t].rc=tree[r].lc;
tree[tree[r].lc].fat=t;
tree[r].lc=t;
tree[t].fat=r;
if (tree[t].root) tree[t].root=,tree[r].root=;
else if (tree[fa].lc==t) tree[fa].lc=r;
else tree[fa].rc=r;
tree[r].fat=fa;
clean();
maintain(t);
maintain(r);
}
inline void right(int t){
int fa=tree[t].fat,l=tree[t].lc;
tree[t].lc=tree[l].rc;
tree[tree[l].rc].fat=t;
tree[l].rc=t;
tree[t].fat=l;
if (tree[t].root) tree[t].root=,tree[l].root=;
else if (tree[fa].lc==t) tree[fa].lc=l;
else tree[fa].rc=l;
tree[l].fat=fa;
clean();
maintain(t);
maintain(l);
}
inline void splay(int t){
while (!tree[t].root){
int fa=tree[t].fat,gr=tree[fa].fat;
pushdown(gr);
pushdown(fa);
pushdown(t);
if (tree[fa].root){
if (tree[fa].lc==t) right(fa);
else left(fa);
}else if (tree[gr].lc==fa){
if (tree[fa].lc==t) right(gr),right(fa);
else left(fa),right(gr);
}else if (tree[fa].rc==t) left(gr),left(fa);
else right(fa),left(gr);
}
}
inline void access(int x){
int y;
for (y=x,x=;y;x=y,y=tree[y].fat){
splay(y);
pushdown(y);
tree[tree[y].rc].root=;
tree[y].rc=x;
tree[x].root=;
maintain(y);
}
}
inline void makeroot(int t){
access(t);
splay(t);
tree[t].tag^=;
}
inline void link(int xx,int yy){
makeroot(xx);
splay(xx);
splay(yy);
pushdown(yy);
tree[tree[yy].rc].root=;
tree[yy].rc=xx;
tree[xx].fat=yy;
tree[xx].root=;
maintain(yy);
}
inline void cutting(int t){
splay(t);
pushdown(t);
int l=tree[t].lc,r=tree[t].rc;
if (l) tree[l].fat=tree[t].fat,tree[l].root=;
if (r) tree[r].fat=,tree[r].root=;
}
inline void cutlink(int xx,int yy,int lo){
makeroot(xx);
access(yy);
splay(yy);
int save=tree[yy].max;
if (tree[save].key<=lo) return;
cutting(save);
tree[save]=info(,,,save,lo,,);
link(save,xx);
link(save,yy);
}
inline int getfat(int t){
while (tree[t].fat) t=tree[t].fat;
return t;
}
inline bool check(int xx,int yy){
makeroot(xx);
access(yy);
splay(yy);
return getfat(xx)==yy;
}
inline int wtf(inli t){
int l=,r=m,mid;
while (l<r-){
mid=(l+r)/;
if (line[mid]<t) l=mid;
else r=mid;
}
return r;
}
inline void build(){
for (int i=;i<=n;i++) tree[i]=info(,,,i,,,);
nn=n;
for (int i=;i<=m;i++){
int save=wtf(line[i]);
if (!ma[save]){
if (check(line[i].x,line[i].y)) cutlink(line[i].x,line[i].y,lon[i]);
else{
++nn;
tree[nn]=info(,,,nn,lon[i],,);
link(nn,line[i].x);
link(nn,line[i].y);
}
}else ask[ma[save]].lll=lon[i];
}
}
inline int getint(){
char ch = getchar();
for ( ; ch > '' || ch < ''; ch = getchar());
int tmp = ;
for ( ; '' <= ch && ch <= ''; ch = getchar())
tmp = tmp * + int(ch) - ;
return tmp;
}
int main(){
freopen("tube.in","r",stdin);
freopen("bz2594.out","w",stdout);
int i,j,xx,yy;
scanf("%d%d%d\n",&n,&m,&q);
for (i=;i<=m;i++){
xx=getint();
yy=getint();
lon[i]=getint();
if (xx>yy) swap(xx,yy);
line[i]=inli(xx,yy,lon[i]);
}
sort(line+,line+m+);
for (i=;i<=m;i++) lon[i]=line[i].lll;
for (i=;i<=q;i++){
bo[i]=getint();
xx=getint();
yy=getint();
if (xx>yy) swap(xx,yy);
ask[i]=inli(xx,yy);
if (bo[i]==) ma[wtf(ask[i])]=i;
}
build();
for (i=q;i;i--){
if (i==){
i=;
}
xx=ask[i].x,yy=ask[i].y;
if (bo[i]==){
makeroot(xx);
access(yy);
splay(yy);
ans[++na]=tree[tree[yy].max].key;
}else cutlink(xx,yy,ask[i].lll);
}
for (i=na;i;i--) printf("%d\n",ans[i]);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [WC2006]水管局长数据加强版

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

  10. 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版

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

随机推荐

  1. Haxe - Actuate.Tween

    方法解释: Actuate.tween( target : Dynamic , duration : Float , properties : Dynamic , ?overwrite : Bool ...

  2. 机器学习 —— 概率图模型(Homework: StructuredCPD)

    Week2的作业主要是关于概率图模型的构造,主要任务可以分为两个部分:1.构造CPD;2.构造Graph.对于有向图而言,在获得单个节点的CPD之后就可依据图对Combine CPD进行构造.在获得C ...

  3. HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩

    思路跟 LA 6187 完全一样. 我是乍一看没反应过来这是个并查集,知道之后就好做了. d[i]代表节点 i 到根节点的距离,即每次的sum. #include <cstdio> #in ...

  4. 在Windows 上的 Python

    在 Windows 上, 安装 Python 有两种选择. ActiveState 制作了一个 Windows 上的 Python 安装程序称为 ActivePython, 它包含了一个完整的 Pyt ...

  5. SQL 分组排序分页(大神帮写的膜拜一下)

    查询全部: SELECT P3.ID, P3.Name, P3.AddTimeFROM (SELECT Name, MAX(AddTime) AS MaxAddTime FROM Product AS ...

  6. bash shell 合并文件

    # 按列合并文件 paste file1 file2 file3 > file4 # 要先 sort, 再 file1 file2 paste格式为: paste -d -s -file1 fi ...

  7. Android开发之创建App Widget和更新Widget内容

    App WidgetsApp Widgets are miniature application views that can be embedded in other applications (s ...

  8. RAPIDXML 中文手册,根据官方文档完整翻译!

    简介:这个号称是最快的DOM模型XML分析器,在使用它之前我都是用TinyXML的,因为它小巧和容易上手,但真正在项目中使用时才发现如果分析一个比较大的XML时TinyXML还是表现一般,所以我们决定 ...

  9. hdu 4911 Inversion (分治 归并排序 求逆序数)

    题目链接 题意:给n个数,求交换k次相邻的数之后的最小的逆序数对. 用分治的方法,以前在poj上做过这种题,昨天比赛的时候忘了.... 下面的归并排序还是以前的模板. #include <ios ...

  10. bzoj1043

    每次做计算几何题都要做好久 考虑每个圆对答案的贡献,也就是每个圆被后面圆覆盖还有多少 可以把覆盖当成盖住一段弧度,看最后有多少没被覆盖 这就相当于线段覆盖问题了, 推推公式,算极角然后排序即可 md, ...