[整体二分 并查集]Atcoder AGC002 D. Stamp Rally
来源:互联网 发布:怎样删除淘宝评价 编辑:程序博客网 时间:2024/06/09 08:54
每个询问就是求最小的
这个东西整体二分一下,用按秩合并的并查集维护一下就好了吧
#include <cstdio>#include <iostream>#include <algorithm>#define fi first#define se secondusing namespace std;typedef pair<int,int> par;const int N=100010;int n,m,q,fa[N],ans[N],size[N],rk[N];par e[N];struct Qry{ int x,y,z,g;}Q[N],a[N],b[N];inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline void read(int &x){ char c=nc(); x=0; for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());}int Gfat(int x){ return fa[x]==x?x:Gfat(fa[x]);}struct sta{ int x,rk;}S[N];int t;inline void Union(int x,int y){ x=Gfat(x); y=Gfat(y); if(x==y) return ; if(rk[x]>rk[y]) swap(x,y); fa[x]=y; size[y]+=size[x]; S[++t]=(sta){x,rk[y]}; if(rk[x]==rk[y]) rk[y]++;}inline void Back(){ int x=S[t].x; size[fa[x]]-=size[x]; rk[fa[x]]=S[t].rk; fa[x]=x; t--;}void solve(int l,int r,int L,int R){ if(l>r) return ; int mid=l+r>>1,t1=0,t2=0,cur=t; for(int i=l;i<=mid;i++) Union(e[i].fi,e[i].se); for(int i=L;i<=R;i++){ int x=Gfat(Q[i].x),y=Gfat(Q[i].y); if(x==y){ if(size[x]>=Q[i].z) a[++t1]=Q[i],ans[Q[i].g]=mid; else b[++t2]=Q[i]; } else{ if(size[x]+size[y]>=Q[i].z) a[++t1]=Q[i],ans[Q[i].g]=mid; else b[++t2]=Q[i]; } } for(int i=1;i<=t1;i++) Q[L+i-1]=a[i]; for(int i=1;i<=t2;i++) Q[L+t1+i-1]=b[i]; solve(mid+1,r,L+t1,R); while(t>cur) Back(); solve(l,mid-1,L,L+t1-1);}int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); read(n); read(m); for(int i=1;i<=n;i++) fa[i]=i,size[i]=rk[i]=1; for(int i=1;i<=m;i++) read(e[i].fi),read(e[i].se); read(q); for(int i=1;i<=q;i++) read(Q[i].x),read(Q[i].y),read(Q[i].z),Q[i].g=i; solve(1,m,1,q); for(int i=1;i<=q;i++) printf("%d\n",ans[i]); return 0;}
阅读全文
0 0
- [整体二分 并查集]Atcoder AGC002 D. Stamp Rally
- [AGC002D]Stamp Rally-整体二分
- AtCoder Not so Diverse 并查集&&二分
- AtCoder - 2159 Connectivity 并查集+二分、快速的求出2个集合的交集
- [agc002d]Stamp Rally
- Atcoder 056 D 贪心+二分
- [AtCoder AGC002 F][DP]Leftmost Ball
- [博弈]Atcoder AGC002 E. Candy Piles
- poj3657 二分+并查集
- VK Cup 2015 - Finals, online mirror D. Restructuring Company 并查集 set 二分
- Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力,二分图,并查集
- Atcoder D
- [二分][并查集]周末出游计划
- POJ 2253 Frogger(并查集+二分)
- UVALive_6168_Fat Ninjas(二分+并查集)
- HDU1598 并查集 或 二分+DFS
- HDU 3938 离线并查集+二分
- 并查集+二分 hnu13433 Dragons
- PAX
- HDU 3951 Coin Game(博弈水题)
- Linux 编译SSD Caffe目标检测代码
- 输入两个链表,找出它们的第一个公共结点
- Java小游戏之猜拳游戏
- [整体二分 并查集]Atcoder AGC002 D. Stamp Rally
- 线程&进程基本概念和Python中线程模块
- CSS组件-搜索框
- 前中序重建二叉树python实现
- java之面向对象2
- Java注解(Annotation)详解(二)——自定义注解
- [博弈]Atcoder AGC002 E. Candy Piles
- 【操作系统学习】(二)同步互斥
- 【嵌入式学习历程12】Linux文件编程