BZOJ 1588 平衡树 模板题
来源:互联网 发布:人工智能导论 编辑:程序博客网 时间:2024/06/06 18:19
Treap:
//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;int size,n,xx,root,ans,tmp;struct Treap{int ch[2],v,cnt,rnd,sz;}tr[500050];void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;}void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}void insert(int &k,int num){ if(!k){k=++size,tr[k].cnt=tr[k].sz=1,tr[k].rnd=rand(),tr[k].v=num;return;} tr[k].sz++; if(tr[k].v==num){tr[k].cnt++;return;} bool f=num>tr[k].v; insert(tr[k].ch[f],num); if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f);}void pre(int k,int num){ if(!k)return; if(tr[k].v==num)tmp=0; else if(tr[k].v>num)tmp=min(tmp,tr[k].v-num),pre(tr[k].ch[0],num); else pre(tr[k].ch[1],num);}void nxt(int k,int num){ if(!k)return; if(tr[k].v==num)tmp=0; else if(tr[k].v<num)tmp=min(tmp,num-tr[k].v),nxt(tr[k].ch[1],num); else nxt(tr[k].ch[0],num);}int main(){ scanf("%d%d",&n,&xx); insert(root,xx),ans+=xx; for(int i=1;i<n;i++){ scanf("%d",&xx); tmp=0x3fffffff,pre(root,xx),nxt(root,xx); ans+=tmp,insert(root,xx); } printf("%d\n",ans);}
Splay:
//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;#define N 33333#define inf 0x3f3f3f3f#define lc(x) ch[(x)][0]#define rc(x) ch[(x)][1]int n,fa[N],ch[N][2],root,k[N],ind=1,xx,ans;void rotate(int p){ int q=fa[p],y=fa[q],x=ch[q][1]==p; ch[q][x]=ch[p][x^1];fa[ch[q][x]]=q; ch[p][x^1]=q;fa[q]=p; fa[p]=y; if(y){ if(ch[y][0]==q)ch[y][0]=p; else ch[y][1]=p; }}void splay(int x){ for(int y;y=fa[x];rotate(x)) if(fa[y]){ if((y==lc(fa[y])&&x==lc(y))||(y==rc(fa[y])&&x==rc(y)))rotate(y); else rotate(x); } root=x;}void insert(int x,int v){ while(ch[x][k[x]<v])x=ch[x][k[x]<v]; ch[x][k[x]<v]=++ind; fa[ind]=x,k[ind]=v,splay(ind);}int pre(int x){ int tmp=ch[x][0]; while(ch[tmp][1])tmp=ch[tmp][1]; return k[tmp];}int suc(int x){ int tmp=ch[x][1]; while(ch[tmp][0])tmp=ch[tmp][0]; return k[tmp];}int main(){ scanf("%d",&n); insert(root,inf),insert(root,-inf); scanf("%d",&xx);insert(root,xx); ans=xx; for(int i=2;i<=n;i++){ scanf("%d",&xx); insert(root,xx); int a=pre(root),b=suc(root); ans+=min(xx-a,b-xx); } printf("%d\n",ans);}
0 0
- BZOJ 1588 平衡树 模板题
- BZOJ 3224 平衡树模板题
- BZOJ 3224 普通平衡树 裸treap模板题
- 平衡树模板&&bzoj 3223&&Tyvj 1729 文艺平衡树
- 【BZOJ】3224 Tyvj 1728 普通平衡树 平衡树模板
- 【BZOJ】3224 Tyvj 1728 普通平衡树 平衡树模板
- [替罪羊树 模板题] BZOJ 3224 Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树(splay 模板题)
- bzoj 3223: Tyvj 1729 文艺平衡树(splay 模板题 区间翻转)
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树 (Splay模板)
- Treap 全操作模板 bzoj 3224 普通平衡树
- 平衡树模板三题
- BZOJ 1208 平衡树Treap模版题
- bzoj3224 普通平衡树 splay模板题
- (模板)平衡二叉树
- 平衡树模板
- 平衡树SBT模板
- Remove Duplicates from Sorted List
- Cygwin下编译包含C的Android源码,出现错误,求大神解答。
- Calendar怎么显示数据库中选定的日期
- 系统相机拍照剪辑问题
- 折线分割平面 HDU - 2050
- BZOJ 1588 平衡树 模板题
- Java入门 二、封装
- listview通过滚动摆脱底部button遮盖的问题
- vs2012 cocos2dx中CCControlButton绑定点击事件无回调
- centos 7创建桌面快捷方式
- 我的Android之旅
- 如何选择适合自己的开源软件
- 获取插入到电脑上的手机型号
- 按键的灵活动作