首页 > 代码库 > HNOI2002营业额统计
HNOI2002营业额统计
题意:维护一个数据结构,能够插入,查找前驱、后继。
平衡树裸题,入门专用。
用的是最容易写的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。。。再也不相信内存池了。
HNOI2002营业额统计
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。