标签:style blog http color io ar for 数据 2014
题意:维护一个数据结构,能够插入,查找前驱、后继。
平衡树裸题,入门专用。
用的是最容易写的treap,BZOJ不让用time函数作随机数种子,所以就生日了,184ms,勉强说得过去吧。
725840 | yzh119 | 1588 | Accepted | 1468 kb | 184 ms | C++/Edit | 1461 B | 2014-08-29 18:10:05 |
1 #include <cstdio> 2 #include <cstdlib> 3 #include <ctime> 4 using namespace std; 5 const int inf=10000000; 6 struct node{ 7 int val,weight; 8 node *ch[2]; 9 node (int key) { 10 val=key;weight=rand(); 11 ch[0]=ch[1]=NULL; 12 } 13 }*root; 14 int n,ans; 15 void rotate(node *&t,int d){ 16 node *c=t->ch[d]; 17 t->ch[d]=c->ch[!d]; 18 c->ch[!d]=t; 19 t=c; 20 } 21 bool find (node *t,int key){ 22 while (t!=NULL) { 23 if (t->val==key) return 1; 24 t=t->ch[key>(t->val)]; 25 } 26 return 0; 27 } 28 int pred (node *t,int key){ 29 int ret=-inf; 30 while (t!=NULL) { 31 if (t->val<key) {if (t->val>ret) ret=t->val;t=t->ch[1];} else 32 t=t->ch[0]; 33 } 34 return ret; 35 } 36 int succ (node *t,int key){ 37 int ret=inf; 38 while (t!=NULL) { 39 if (t->val>key) {if (t->val<ret) ret=t->val;t=t->ch[0];} else 40 t=t->ch[1]; 41 } 42 return ret; 43 } 44 void insert (node *&t,int key){ 45 if (t==NULL) { 46 t=new node(key);return ; 47 } 48 int d=key>t->val; 49 insert(t->ch[d],key); 50 if (t->ch[d]->weight>t->weight) rotate(t,d); 51 } 52 int main(){ 53 ans=0; 54 srand(19961111); 55 scanf("%d",&n); 56 int x,x1,x2; 57 scanf("%d",&x);ans+=x; 58 root=new node(x); 59 for (int i=2;i<=n;i++){ 60 if (scanf("%d",&x)==EOF) x=0; 61 if (!find(root,x)) { 62 x1=pred(root,x);x2=succ(root,x); 63 ans+=(x2-x<x-x1)?x2-x:x-x1; 64 insert(root,x); 65 } 66 } 67 printf("%d\n",ans); 68 return 0; 69 }
后来用内存池代替动态分配内存的竟然也要180ms。。。再也不相信内存池了。
标签:style blog http color io ar for 数据 2014
原文地址:http://www.cnblogs.com/yzh119/p/3945597.html