Treap入门题
2017-09-02 17:37
197 查看
bzoj1691
bzoj3234
bzoj1588
bzoj3234
bzoj1588
bzoj1691
排序维护一维满足,另一位用treap维护#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e6+10; struct data { int l,r,v,size,rnd,w; }tr ; struct grass{ int a,b; bool operator <(const grass &rhs)const { return rhs.b<b; } }a ,b ; int n,m,size,root,ans; void update(int k) { tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } void rturn(int &k) { int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; tr[t].size=tr[k].size;update(k);k=t; } void lturn(int &k) { int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; tr[t].size=tr[k].size;update(k);k=t; } void insert(int &k,int x) { if(k==0) { size++;k=size; tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd=rand(); return ; } tr[k].size++; if(tr[k].v==x) tr[k].w++; else if(x>tr[k].v) { insert(tr[k].r,x); if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k); }else { insert(tr[k].l,x); if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k); } } void del(int &k,int x) { if(k==0) return ; if(tr[k].v==x) { if(tr[k].w>1) { tr[k].w--;tr[k].size-- ;return ; } if(tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r; else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd) rturn(k),del(k,x); else lturn(k),del(k,x); } else if(x>tr[k].v) tr[k].size--,del(tr[k].r,x); else tr[k].size--,del(tr[k].l,x); } void query_sub(int k,int x) { if(k==0) return ; if(tr[k].v>=x) ans=tr[k].v,query_sub(tr[k].l,x); else query_sub(tr[k].r,x); } int main() { scanf("%d%d",&n,&m); fo(i,1,n) scanf("%d%d",&a[i].a,&a[i].b); fo(i,1,m) scanf("%d%d",&b[i].a,&b[i].b); sort(a+1,a+1+n); sort(b+1,b+1+m); int j=1;long long tot=0; for(int i=1;i<=n;i++) { ans=-1; while(b[j].b>=a[i].b&&j<=m) {insert(root,b[j].a);j++;} query_sub(root,a[i].a); if(ans==-1) {printf("-1\n");return 0;} tot+=ans;del(root,ans); } printf("%lld\n",tot); return 0; }
bzoj3234
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e5+10; struct data { int l,r,v,size,rnd,w; }tr ; int n,size,root,ans; void update(int k) { tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } void rturn(int &k) { int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; tr[t].size=tr[k].size;update(k);k=t; } void lturn(int &k) { int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; tr[t].size=tr[k].size;update(k);k=t; } void insert(int &k,int x) { if(k==0) { size++;k=size; tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd=rand(); return ; } tr[k].size++; if(tr[k].v==x) tr[k].w++; else if(x>tr[k].v) { insert(tr[k].r,x); if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k); }else { insert(tr[k].l,x); if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k); } } void del(int &k,int x) { if(k==0) return ; if(tr[k].v==x) { if(tr[k].w>1) { tr[k].w--;tr[k].size-- ;return ; } if(tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r; else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd) rturn(k),del(k,x); else lturn(k),del(k,x); } else if(x>tr[k].v) tr[k].size--,del(tr[k].r,x); else tr[k].size--,del(tr[k].l,x); } int query_rank(int k,int x) { if(k==0) return 0; if(tr[k].v==x) return tr[tr[k].l].size+1; else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x); else return query_rank(tr[k].l,x f767 ); } int query_num(int k,int x) { if(k==0) return 0; if(x<=tr[tr[k].l].size) return query_num(tr[k].l,x); else if(x>tr[tr[k].l].size+tr[k].w) return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); else return tr[k].v; } void query_pro(int k,int x) { if(k==0) return ; if(tr[k].v<x) ans=k,query_pro(tr[k].r,x); else query_pro(tr[k].l,x); } void query_sub(int k,int x) { if(k==0) return ; if(tr[k].v>x) ans=k,query_sub(tr[k].l,x); else query_sub(tr[k].r,x); } int main() { scanf("%d",&n); for(int op,x,i=1;i<=n;i++) { scanf("%d%d",&op,&x); switch(op){ case 1:insert(root,x);break; case 2:del(root,x);break; case 3:printf("%d\n",query_rank(root,x));break; case 4:printf("%d\n",query_num(root,x));break; case 5:ans=0;query_pro(root,x);printf("%d\n",tr[ans].v);break; case 6:ans=0;query_sub(root,x);printf("%d\n",tr[ans].v);break; } } }
bzoj1588
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e5+10,inf=(1<<30); struct data { int l,r,v,size,rnd,w; }tr ; int n,size,root,ans,mn,mx; void update(int k){tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;} void rturn(int &k) { int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; tr[t].size=tr[k].size;update(k);k=t; } void lturn(int &k) { int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; tr[t].size=tr[k].size;update(k);k=t; } void insert(int &k,int x) { if(k==0) { size++;k=size; tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd=rand(); return ; } tr[k].size++; if(tr[k].v==x) tr[k].w++; else if(x>tr[k].v) { insert(tr[k].r,x); if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k); }else { insert(tr[k].l,x); if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k); } } void query_pro(int k,int x) { if(k==0) return ; if(tr[k].v==x) {mn=tr[k].v;return ;} if(tr[k].v<x) mn=tr[k].v,query_pro(tr[k].r,x); else query_pro(tr[k].l,x); } void query_sub(int k,int x) { if(k==0) return ; if(tr[k].v==x) {mx=tr[k].v;return ;} if(tr[k].v>x) mx=tr[k].v,query_sub(tr[k].l,x); else query_sub(tr[k].r,x); } int main() { scanf("%d",&n); long long ans=0; for(int i=1,x;i<=n;i++) { if(scanf("%d",&x)==EOF) x=0; mx=inf;mn=-inf; query_pro(root,x);query_sub(root,x); if(i!=1) ans+=min(x-mn,mx-x); else ans+=x; insert(root,x); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 无旋Treap——从入门到放弃
- treap入门题。。
- POJ 1442 (treap 求出名次入门)
- poj2761(treap入门)
- Treap入门(转自NOCOW)
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
- Treap入门(转自NOCOW)
- UVA 12538 可持久化treap入门
- Treap入门题
- 非诚勿扰 - HDU 4557 - Treap入门
- treap入门
- 旋转还是无旋?treap从入门到想死
- 无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
- poj3481double queue【treap树入门题】
- 数据结构入门1—Treap
- poj 1442 Black Box (treap树入门题)
- Treap入门笔记
- 分布式计算开源框架Hadoop入门实践
- TensorFlow入门--基本概念的理解
- HibernateAnnotation入门实例