题意:

给出一张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. java工具类–自动将数据库表生成javabean

    最近和数据库的表打交道挺多的,因为暂时做的是接口活. 在这过程中发现要把表转换成对应的javabean类型,字段少的表还行,如果不小心碰到几十个字段的他妈的写起来就有点麻烦了,万一碰到几百个的呢,那不 ...

  2. maven 仓库下载缓慢,怎么解决

    maven下载jar的时候会去寻国外的地址,因此造成了下载jar很缓慢,影响开发效率,于是就出现maven镜像地址,可以使我们开发人员迅速下载相关的jar. 在maven的config的setting ...

  3. ios ableviewcell的动态加载数据,模仿喜马拉雅动态数据加载

    iphone(UITableViewCell)动态加载图片http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Intr ...

  4. BZOJ 2440 完全平方数(莫比乌斯-容斥原理)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2440 题意:给定K.求不是完全平方数(这里1不算完全平方数)的倍数的数字组成的数字集合S ...

  5. Codeforces 4538 (状态压缩dp)Little Pony and Harmony Chest

    Little Pony and Harmony Chest 经典状态压缩dp #include <cstdio> #include <cstring> #include < ...

  6. BZOJ_1030_[JSOI2007]_文本生成器_(AC自动机+DP)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1030 给出一些单词,问长度为\(m\)的文章有多少文章中出现过任意一个或多个单词. 分析 文章 ...

  7. css配合js模拟的select下拉框

    css配合js模拟的select下拉框 <!doctype html> <html> <head> <meta charset="utf-8&quo ...

  8. 高斯消元与xor方程组

    ;i<=n;i++) { ;j<=n;j++) if(a[j]>a[i]) swap(a[i],a[j]); if(!a[i]) break; ;j>=;j--) ) { ;k ...

  9. SQL Server索引怎么用

    什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音. ...

  10. apache开源项目--subversion

    Subversion exists to be universally recognized and adopted as an open-source, centralized version co ...