hdu1512 Monkey King
2017-05-16 11:37
316 查看
用左偏树维护,每次操作删除两个堆顶再合并。
#include<cstdio> #include<algorithm> using namespace std; const int maxn=100010; int a[maxn],fa[maxn],lson[maxn],rson[maxn],hei[maxn],size[maxn], n; int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } int merge(int u,int v) { if (u*v==0) return u+v; if (a[u]<a[v]) swap(u,v); rson[u]=merge(rson[u],v); if (hei[lson[u]]<hei[rson[u]]) swap(lson[u],rson[u]); hei[u]=hei[rson[u]]+1; return u; } void solve() { int q,u,v,x,y,r; for (int i=1;i<=n;i++) { scanf("%d",&a[i]); fa[i]=i; lson[i]=rson[i]=0; hei[i]=size[i]=1; } scanf("%d",&q); while (q--) { scanf("%d%d",&u,&v); if (find(u)==find(v)) printf("-1\n"); else { u=fa[u]; v=fa[v]; x=merge(lson[u],rson[u]); y=merge(lson[v],rson[v]); a[u]/=2; a[v]/=2; size[u]=size[v]=hei[u]=hei[v]=1; lson[u]=lson[v]=rson[u]=rson[v]=0; r=merge(merge(u,x),merge(v,y)); fa[u]=fa[v]=fa[r]=r; printf("%d\n",a[r]); } } } int main() { while (scanf("%d",&n)==1) solve(); }
相关文章推荐
- 【左偏树】HDU1512-Monkey King
- HDU 1512 Monkey King 左偏树 + 并查集
- hdu 1512 Monkey King (左偏树可并堆 并查集)
- HDU 1512 Monkey King
- HDU-1512-Monkey King
- hdu 1512 Monkey King
- HDU 1512 Monkey King(左偏树)
- hdu 1512 Monkey King 左偏树
- [hdu-1512]Monkey King 题解
- hdu 1512 Monkey King 左偏树(可并堆)
- hdu 1512 Monkey King
- hdu1512 Monkey King(并查集,左偏堆)
- HDU 1512 Monkey King ——左偏树
- HDU 1512 HDOJ 1512 Monkey King ( 左偏树 ) ACM 1512 IN HDU
- hdu 1512 Monkey King
- hdu1512 Monkey King
- Hdu 1512 Monkey King(左偏树+并查集)
- hdu 1512 Monkey King
- HDU 1512 Monkey King
- hdu 1512 Monkey King(坑)