【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处,嘟嘟需要为供水公司找到一 ...
随机推荐
- 创建高安全性PHP网站的几个实用要点
大家都知道PHP已经是当前最流行的Web应用编程语言了.但是也与其他脚本语言一样,PHP也有几个很危险的安全漏洞.所以在这篇教学文章中,我们将大致看看几个实用的技巧来让你避免一些常见的PHP安全问题. ...
- javascript 字符转义汇总
在开发中经常遇到需要字符转义的,我将一一把遇到的转义列举出来 1.今天中午做项目的时候遇到一个字符串链接的问题,需要链接的的是一个函数的参数 时间字符串:"2014-04-08 16:37: ...
- [HDOJ1698]Just a Hook(线段树,区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 陈题,更新后查询所有叶节点的和.撸一遍模版,形成自己的风格. #include <algo ...
- IT玄幻小说
职业 设计:菜鸟 美工<初级,中级,高级,资深> 设计师<初级,中级,高级,资深> 大神 前端:菜鸟 前端<初级,中级,高级,资深> 架构师<初级,中 ...
- 数据库锁机制(一)——概述
注:内容为自己的推理认知+网络,如有错误和不合理之处,敬请指出. 在多线程环境中我用使用线程锁处理并发问题,而在数据库系统中,并发问题可以细化到事务级别,而DBMS对此的处理方案就是使用锁. 为了适应 ...
- 无法连接到SQL Server 2008 R2
服务器环境: 操作系统 名称: Microsoft Windows Server 2008 R2 Enterprise 版本: 6.1.7601 服务包: Ser ...
- Android基础_2 Activity线性布局和表格布局
在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是 ...
- 【转】declare-styleable的使用(自定义控件) 以及declare-styleable中format详解
原文网址:http://www.cnblogs.com/622698abc/p/3348692.html declare-styleable是给自定义控件添加自定义属性用的 1.首先,先写attrs. ...
- Java中的面向接口编程
面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...
- 【转】移动web资源整理
目录(更新于20150311) meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速 ...