【bz2594】水管局长数据加强版
题意:
给出一张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】水管局长数据加强版的更多相关文章
- BZOJ2594: [Wc2006]水管局长数据加强版
题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...
- bzoj 2594: [Wc2006]水管局长数据加强版 动态树
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
- BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )
离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...
- [bzoj2594][Wc2006]水管局长数据加强版 (lct)
论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...
- BZOJ 2594: [Wc2006]水管局长数据加强版 [LCT kruskal]
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 2917 Solved: 918[Submit][St ...
- BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
BZOJ_2594_[Wc2006]水管局长数据加强版_LCT Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供 ...
- BZOJ 2594 【WC2006】 水管局长数据加强版
题目链接:水管局长数据加强版 好久没写博客了…… 上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手. 首先,LCT这里不讲.这道题要求支持动态 ...
- [WC 2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- [WC2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
随机推荐
- 腾讯大讲堂ppt全集
腾讯大讲堂ppt全集 腾讯大讲堂ppt全集资料下载 腾讯大讲堂ppt1-62资料下载 最新最全的腾讯大讲堂ppt全集 腾讯大讲堂ppt全集资料下载 腾讯大讲堂ppt1-62资料下载地址 http:// ...
- CMake学习(1)---简单程序与库
cmake是linux平台下重要的工具,可以方便的组织makefile.之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果.但是程序的编译并没有那么简 ...
- 增加oracle数据库最大连接数
这几天碰到系统不能登陆的情况,初步判断可能是数据库连接满了,(后来检查不是这个原因),做了一次增加数据库最大连接数操作.操作步骤如下 操作系统:Red Hat Enterprise Linux Ser ...
- 选择语句----switch case
今天学习了选择语句的 switch case是多选一的情况可以使用. 案例: //分别输入月份 几号 输出是今年的多少天 //每年的1,3,5,7,8,10,12月是31天 //今年的2月是28天 其 ...
- 聊聊HTTPS和SSL/TLS协议 分类: 计算机网络 2015-07-11 21:41 4人阅读 评论(0) 收藏
要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 2. 大致了解 HTTP 和 TCP 的关系(尤其是"短连接 ...
- [leetcode72]Edit Distance(dp)
题目链接:https://leetcode.com/problems/edit-distance/ 题意:求字符串的最短编辑距离,就是有三个操作,插入一个字符.删除一个字符.修改一个字符,最终让两个字 ...
- POJ 3177 Redundant Paths (桥,边双连通分量,有重边)
题意:给一个无向图,问需要补多少条边才可以让整个图变成[边双连通图],即任意两个点对之间的一条路径全垮掉,这两个点对仍可以通过其他路径而互通. 思路:POJ 3352的升级版,听说这个图会给重边.先看 ...
- git - 搭建git仓库
1. 更新git版本: http://codelife.me/blog/2013/06/25/upgrade-git-on-centos-6-4/ 2. 建立git仓库: git init --bar ...
- <十一>面向对象分析之UML核心元素之组件
组件
- SQL优化34条
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析 ...