博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1208 宠物收养所
阅读量:4478 次
发布时间:2019-06-08

本文共 2563 字,大约阅读时间需要 8 分钟。

p.s.我只是拿来练treap的。。。treap比SBT真心好写啊。。。又参考了一下别人的treap写法。。真心飘逸。。。。学习之。。。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 using namespace std; 15 const int inf=~0u>>1; 16 const int mod = (int)1e6; 17 struct node{ 18 node *ch[2]; 19 int v,p,sz; 20 node(int _v,node *n): 21 v(_v){ch[0]=ch[1]=n;p=rand();sz=1;} 22 void upt(){sz=ch[0]->sz+ch[1]->sz+1;} 23 }; 24 struct Treap{ 25 node *root,*null; 26 Treap(){ 27 null=new node(0,0);null->sz=0;null->p=inf; 28 null->ch[0]=null->ch[1]=null; 29 root=null; 30 } 31 void rot(node *&t,bool d){ 32 node *_t=t->ch[d];t->ch[d]=_t->ch[!d]; 33 _t->ch[!d]=t;t->upt();_t->upt();t=_t; 34 } 35 void insert(node *&t,int val){ 36 if(t==null){t=new node(val,null);return;} 37 bool d=val > t->v; 38 insert(t->ch[d],val); 39 if(t->ch[d]->p < t->p)rot(t,d); 40 t->upt(); 41 } 42 void del(node *&t,int val){ 43 if(t==null)return; 44 if(val == t->v){ 45 bool d = t->ch[1]->p < t->ch[0]->p; 46 if(t->ch[d]==null){delete t;t=null;return;} 47 rot(t,d);del(t->ch[!d],val); 48 }else{ 49 bool d=val > t->v; 50 del(t->ch[d],val); 51 } 52 t->upt(); 53 } 54 node* pred(node *t,int val,node *ans){ 55 if(t==null)return ans; 56 if(t->v <= val) 57 return pred(t->ch[1],val,t); 58 else 59 return pred(t->ch[0],val,ans); 60 } 61 node *succ(node *t,int val,node *ans){ 62 if(t==null)return ans; 63 if(t->v >= val) 64 return succ(t->ch[0],val,t); 65 else 66 return succ(t->ch[1],val,ans); 67 } 68 int solve(int a){ 69 node *pre,*suc; 70 pre=pred(root,a,null); 71 suc=succ(root,a,null); 72 if(pre!=null&&suc!=null){ 73 if(abs(a-(pre->v))>abs(a-(suc->v))){ 74 del(root,suc->v); 75 return abs(a-(suc->v)); 76 }else{ 77 del(root,pre->v); 78 return abs(a-(pre->v)); 79 } 80 }else if(pre==null){ 81 del(root,suc->v); 82 return abs(a-(suc->v)); 83 }else if(suc==null){ 84 del(root,pre->v); 85 return abs(a-(pre->v)); 86 } 87 } 88 int size(){ 89 return root->sz; 90 } 91 }; 92 int main(){ 93 int n,op,a; 94 scanf("%d",&n); 95 Treap x,y; 96 int ans=0; 97 for(int i=1;i<=n;i++){ 98 scanf("%d%d",&op,&a); 99 if(op==0){100 if(y.size()==0){101 x.insert(x.root,a);102 }else{103 ans=(ans+y.solve(a))%mod;104 }105 }else if(op==1){106 if(x.size()==0){107 y.insert(y.root,a);108 }else{109 ans=(ans+x.solve(a))%mod;110 }111 }112 }113 printf("%d\n",ans%mod);114 return 0;115 }

 

 

转载于:https://www.cnblogs.com/silver-bullet/archive/2013/03/27/2985205.html

你可能感兴趣的文章
关于float和margin
查看>>
简单的正则解析
查看>>
【原创】StreamInsight查询系列(七)——基本查询操作之基础排序
查看>>
C# 安装包制作
查看>>
【P2564】生日礼物(单调队列)
查看>>
Instuments工具
查看>>
新创建django项目,但网页打不开127.0.0.1:8000
查看>>
Python练习-内置函数的应用
查看>>
洛谷P3905 道路重建
查看>>
数据表格 - DataGrid - 行编辑
查看>>
HQL查询语句
查看>>
jsp听课笔记(四)
查看>>
vim
查看>>
数组的键/值操作函数
查看>>
Android单点触控与多点触控切换的问题解决方案
查看>>
JS常用函数与方法
查看>>
十、Shell基础
查看>>
py16 面向对象深入
查看>>
CentOS 7 安装 Gitlab
查看>>
JavaScript-03-常见函数
查看>>