题意:

给出一张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. Android ActionBar的Overlay模式如何不遮盖顶部内容的问题

    关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...

  2. Maven找不到java编译器的问题

    当使用mvn package打包项目的时候,抛出下面这个错误: [ERROR] Unable to locate the Javac Compiler in: D:\jdk\..\lib\tools. ...

  3. php-resque 任务队列

    php-resque License : MIT Source Code Allo点评:php-resque是Ruby项目resque在php下的实现.虽然Gearman也是一个不错的选择,但是res ...

  4. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  5. python学习,dict的映射练习

    练习dict的映射 #coding:utf-8 #问题: a->c, b->d, c->e... 现在有结果字符串求原字符串 dict1={'a':'c', 'b':'d', 'c' ...

  6. 设置MySQL主从同步

    1. 配置主服务器 1.1 编辑my.cnf文件,配置主服务器ID. [mysqld] log-bin=mysql-bin server-id=1relay-log = relay-bin relay ...

  7. 使用easyui实现列表的批量删除

    使用easyui实现列表的批量删除 首先要做的就是增加一个多选框 <table id="otGrid" nowrap="false" style=&quo ...

  8. Internet Explorer for Mac the Easy Way: Run IE 7, IE8, & IE9 Free in a Virtual Machine

        From link: http://osxdaily.com/2011/09/04/internet-explorer-for-mac-ie7-ie8-ie-9-free/ If you’re ...

  9. USACO 2006 November Gold

    POJ 3253 Fence Repair STL堆操作 我想说,STL里堆是我目前见到最蛋疼的操作. #include <cstdio> #include <cstring> ...

  10. Json转译

    public string ListToJson<T>(IList<T> list, string jsonName) { StringBuilder Json = new S ...