[BZOJ3224] 替罪羊树版本
2016-02-06 23:31
423 查看
平衡树裸题。。。
没有区间操作可以用来写替罪羊树的模版
【进度略慢呢。。。还得把一些基础内容过一遍。。。算是认清自己定位了,翻盘好像并不是那么容易的事
没有区间操作可以用来写替罪羊树的模版
【进度略慢呢。。。还得把一些基础内容过一遍。。。算是认清自己定位了,翻盘好像并不是那么容易的事
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const double alpha=0.75; int ls[200010],rs[200010],siz[200010],travel[200010],cnt[200010],stk[200010],v[200010]; int n,top,t1,root,goat; bool exist[100010]; void dfs(int ro){ if (!ro) return; dfs(ls[ro]); if (exist[ro]) travel[++t1]=ro; else stk[++top]=ro; dfs(rs[ro]); } void build(int &ro,int l,int r){ int mid=(l+r)>>1; ro=travel[mid]; if (l==r) { siz[ro]=cnt[ro]=1; ls[ro]=rs[ro]=0; return ; } if (l<mid) build(ls[ro],l,mid-1); else ls[ro]=0; build(rs[ro],mid+1,r); siz[ro]=siz[ls[ro]]+siz[rs[ro]]+1; cnt[ro]=cnt[ls[ro]]+cnt[rs[ro]]+1; } void rebuild(int &ro){ t1=0;dfs(ro); if (t1) build(ro,1,t1); else ro=0; } void insert(int &ro,int x){ if (ro==0) { ro=stk[top--];v[ro]=x; siz[ro]=cnt[ro]=exist[ro]=1; ls[ro]=rs[ro]=0; return ; } siz[ro]++;cnt[ro]++; if (x<=v[ro]) insert(ls[ro],x); else insert(rs[ro],x); if ((double)siz[ro]*alpha>(double)max(siz[ls[ro]],siz[rs[ro]])){ if (goat){ if (ls[ro]==goat) rebuild(ls[ro]); else rebuild(rs[ro]); goat=0; } } else goat=ro; } void del_id(int &ro,int x){ if (exist[ro]&&x==siz[ls[ro]]+1){ exist[ro]=0; siz[ro]--; return ; } siz[ro]--; if (x<=siz[ls[ro]]+exist[ro]) del_id(ls[ro],x); else del_id(rs[ro],x-siz[ls[ro]]-exist[ro]); } int rank(int x){ int now=root; int ans=1; while (now){ if (v[now]>=x) now=ls[now]; else { ans+=siz[ls[now]]+exist[now]; now=rs[now]; } } return ans; } void del_val(int x){ del_id(root,rank(x)); if ((double)siz[root]<(double)alpha*cnt[root]) rebuild(root); } int get_xth(int x){ int now=root; while (now){ if (exist[now]&&x==siz[ls[now]]+1) return v[now]; else if (siz[ls[now]]>=x) now=ls[now]; else { x-=siz[ls[now]]+exist[now]; now=rs[now]; } } } int main(){ scanf("%d",&n); root=0; for (int i=400000;i>=1;i--) stk[++top]=i; int opt,x; for (int i=1;i<=n;i++){ scanf("%d%d",&opt,&x); switch(opt){ case 1:insert(root,x);break; case 2:del_val(x);break; case 3:printf("%d\n",rank(x));break; case 4:printf("%d\n",get_xth(x));break; case 5:printf("%d\n",get_xth(rank(x)-1));break; case 6:printf("%d\n",get_xth(rank(x+1)));break; } } }
相关文章推荐
- 机器学习系列02——机器学习基础
- HDU 5513 Efficient Tree 生成树计数+状态压缩
- 3. Django框架下Jinja模板的使用
- Codeforces Wunder fund 618ABCDEF
- SpringMVC、MyBatis 声明式事务管理
- C预处理器
- 生活随笔:多一点理解医生和护士
- aircrack-ng套装破解wifi过程详解
- leetcode Median of Two Sorted Arrays
- 发布文章
- lua 模块功能
- SpringMVC、MyBatis声明式事务管理
- [BZOJ1500]维修序列
- Bootstrap
- Markdown轻标记语言学习
- 双人博弈类dp总结
- JQuery 基本知识
- 初识github的一点小问题
- 老板们请注意,最好的抢人机会到了!
- POJ_P3074 Sudoku(DLX)