BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
Description
Input
Output
Sample Input
1 2 2
2 3 3
3 4 2
1 4 2
1 1 4
2 1 4
1 1 4
Sample Output
2
3
【原题数据范围】
N ≤ 1000
M ≤ 100000
Q ≤ 100000
测试数据中宣布报废的水管不超过5000条;且任何时候我们考虑的水管网络都是连通的,即从任一结点A必有至少一条水管路径通往任一结点B。
【加强版数据范围】
N ≤ 100000
M ≤ 1000000
Q ≤ 100000
删边不如离线加边往里插。
类似魔法森林那道题,LCT维护权值最大的边,然后需要在加边的时候判断是否要加进去。
听起来非常简单,然而删边时不告诉你编号。。。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd() {
register int x=0; register char s=nc();
while(s<'0'||s>'9')s=nc();
while(s>='0'&&s<='9')x=(x<<3)+(x<<1)+s-'0',s=nc();
return x;
}
#define N 100050
#define M 1100050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int ch[M][2],f[M],val[M],rev[M],tot,mx[M],n,m,qs,fa[N];
int killx[M],killy[M],ans[M],nxt[M];
int find(int x) {
return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct A {
int x,y,v,id,flg;
}e[M],ev[M];
bool cmp1(const A &x,const A &y) {
if(x.x==y.x) return x.y<y.y;
return x.x<y.x;
}
bool cmp2(const A &x,const A &y) {
return x.v<y.v;
}
struct QAQ {
int opt,x,y,pos;
}q[N];
inline bool isrt(int p) {
return ch[f[p]][0]!=p&&ch[f[p]][1]!=p;
}
inline void pushup(int p) {
mx[p]=p;
if(val[mx[ls]]>val[mx[p]]) mx[p]=mx[ls];
if(val[mx[rs]]>val[mx[p]]) mx[p]=mx[rs];
}
inline void pushdown(int p) {
if(rev[p]) {
swap(ch[ls][0],ch[ls][1]);
swap(ch[rs][0],ch[rs][1]);
rev[ls]^=1; rev[rs]^=1; rev[p]=0;
}
}
void update(int p) {
if(!isrt(p)) update(f[p]);
pushdown(p);
}
void rotate(int x) {
int y=f[x],z=f[y],k=get(x);
if(!isrt(y)) ch[z][ch[z][1]==y]=x;
ch[y][k]=ch[x][!k]; f[ch[y][k]]=y;
ch[x][!k]=y; f[y]=x; f[x]=z;
pushup(y); pushup(x);
}
void splay(int x) {
update(x);
for(int fa;fa=f[x],!isrt(x);rotate(x))
if(!isrt(fa))
rotate(get(fa)==get(x)?fa:x);
}
void access(int p) {
int t=0;
while(p) splay(p),rs=t,pushup(p),t=p,p=f[p];
}
void makeroot(int p) {
access(p); splay(p); swap(ls,rs); rev[p]^=1;
}
void link(int x,int p) {
makeroot(x); splay(p); f[x]=p;
}
void cut(int x,int p) {
makeroot(x); access(p); splay(p); ls=f[x]=0;
}
int query(int x,int p) {
makeroot(x); access(p); splay(p); return mx[p];
}
int search(int x,int y) {
int l=1,r=m+1;
while(l<r) {
int mid=(l+r)>>1;
if(x>e[mid].x) l=mid+1;
else r=mid;
}
r=nxt[x]+1;
while(l<r) {
int mid=(l+r)>>1;
if(y>e[mid].y) l=mid+1;
else r=mid;
}
return l;
}
int main() {
n=rd(); m=rd(); qs=rd();
register int i,x,y,dx,dy,tmp,d;
for(i=1;i<=m;i++) {
//e为x升序边便于二分
e[i].x=rd(),e[i].y=rd(),e[i].v=rd();
if(e[i].x>e[i].y) swap(e[i].x,e[i].y);
}
sort(e+1,e+m+1,cmp1);
for(i=1;i<=n;i++) fa[i]=i;
//ev为权值排序
for(i=1;i<=m;i++) ev[i]=e[i],nxt[e[i].x]=max(nxt[e[i].x],i)/*,printf("e[i].x=%d,nxt[e[i].x]=%d\n",e[i].x,nxt[e[i].x])*/;
for(i=1;i<=qs;i++) {
q[i].opt=rd(); q[i].x=rd(); q[i].y=rd();
if(q[i].opt==1) continue;
if(q[i].x>q[i].y) swap(q[i].x,q[i].y);
q[i].pos=search(q[i].x,q[i].y);
//printf("q[i].pos=%d ,q[i].x=%d ,q[i].y=%d\n",q[i].pos,q[i].x,q[i].y);
e[q[i].pos].flg=ev[q[i].pos].flg=1;
}
int tot=n,cnt=0;
sort(ev+1,ev+m+1,cmp2);
for(i=1;i<=m;i++) {
if(!ev[i].flg) {
int x=ev[i].x,y=ev[i].y;
int dx=find(x),dy=find(y);
if(dx!=dy) {
//printf("x=%d , y=%d\n",x,y);
tot++; val[tot]=ev[i].v; killx[tot]=x; killy[tot]=y; mx[tot]=tot;
link(x,tot); link(tot,y); fa[dx]=dy;
}
}
}
for(i=qs;i;i--) {
x=q[i].x; y=q[i].y;
if(q[i].opt==1) {
makeroot(x); access(y); splay(y);
ans[++cnt]=val[mx[y]];
}else {
int tmp=q[i].pos;
int dx=find(x),dy=find(y);
if(dx!=dy) {
tot++; val[tot]=e[tmp].v; killx[tot]=x; killy[tot]=y; mx[tot]=tot;
link(x,tot); link(tot,y); fa[dx]=dy;
}else {
int d=query(x,y);
if(val[d]>e[tmp].v) {
tot++; val[tot]=e[tmp].v; killx[tot]=x; killy[tot]=y; mx[tot]=tot;
cut(killx[d],d); cut(d,killy[d]); link(x,tot); link(tot,y);
}
}
}
}
for(i=cnt;i;i--) {
printf("%d\n",ans[i]);
}
}
BZOJ_2594_[Wc2006]水管局长数据加强版_LCT的更多相关文章
- 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 ...
- [WC2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- 2594. [WC2006]水管局长数据加强版【LCT+最小生成树】
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】
题目 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的 ...
随机推荐
- UML类图中连接线与箭头的含义(转)
UML类图是描述类之间的关系 概念 类(Class):使用三层矩形框表示. 第一层显示类的名称,如果是抽象类,则就用斜体显示. 第二层是字段和属性. 第三层是类的方法. 注意前面的符号,'+'表示pu ...
- CSDN的博客搜索功能不又给力了呵呵呵呵
不得不说,CSDN博客的搜索功能是在太弱了.而且一直都很弱,以至于我每次想在自己博客上找自己发的文章都变得那么难.做一个搜索博客内文章的功能没有那么难吧? 还是说CSDN已经放弃了博客这一块了? 我发 ...
- 编程题:利用for循环打印 9*9 表?
利用for循环打印 9*9 表? 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 ...
- oracle面试题目总结
阿里巴巴公司DBA笔试题 http://searchdatabase.techtarget.com.cn/tips/2/2535002.shtml 注:以下题目,可根据自己情况挑选题目作答,不必 ...
- linux安装VLAN,系统怎么划分VLAN打标签上交换机
前几天公司一台物理机需要连接公网,但是公网需要网卡打标签上去. 由于没有做过linux主机划分VLAN的操作,因此去查了一下,需要利用vconfig这个命令. 但是纠结的是,系统源中没有这个包.(很坑 ...
- SDL相关资料
SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏.游戏SDK.演示软件.模拟器.MPEG播放器和其他应用软件.目前支持windows,linux ...
- Terminating app due to uncaught exception 'CALayerInvalid', reason: 'layer <CALayer: 0x7fda42c66e30> is a part of cycle in its layer tree'
iOS App里面所有的View构成一个组件树,这个树里面如果有了闭环就会出现这个报错,最常见的你不小在某UIViewController里面写了这样的代码: someView.addSubView( ...
- unity零基础开始学习做游戏(四)biu~biu~biu发射子弹打飞机
-------小基原创,转载请给我一个面子 主角都能移动了,那不得做点什么伸张正义,守护世界和平的事嘛,拿起家伙biu~biu~biu~ 首先得做一个好人和一个坏人 老规矩,Canvas下创建两个Im ...
- PHP合并数组的三种方法的分析与比较
常用的合并数组的方法有三种:array_merge().array_merge_recursive().+,下面一个一个介绍 array_merge() 此函数合并一个或多个数组,当输入的数组中有相同 ...
- Invoke-ASCmd 部署SSAS database
Install-Module -Name SqlServer -RequiredVersion 21.0.17099 -AllowClobberInvoke-ASCmd -Server 10.162. ...