点击打开链接
题意:不描述了
思路:我们只需要一个树就可以,输入一个数就存进去,当人和动物都大于0的时候,开始给人分配宠物,人的期望值b的排名k,找到k-1的数和k+1的数,比较哪个离b更近,人多还是动物动情况一样不用分开讨论,然后加起来取余输出,简单题
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=100010; const int mod=1000000; struct treap_node{ treap_node *left,*right; int val,fix,wgt,size; treap_node(int val): val(val) {left=right=NULL; size=wgt=1; fix=rand(); } int lsize(){ if (left) return left->size; else return 0; } int rsize(){ if (right) return right->size; else return 0; } void Maintain(){ size=wgt; size+=lsize()+rsize(); } }; treap_node *root; void tlr(treap_node *&a){ treap_node *b=a->right; a->right=b->left; b->left=a; a->Maintain(); b->Maintain(); a=b; } void trr(treap_node *&a){ treap_node *b=a->left; a->left=b->right; b->right=a; a->Maintain(); b->Maintain(); a=b; } void treap_insert(treap_node *&p,int value){ if (!p) p=new treap_node(value); else{ if (value==p->val) p->wgt++; if (value<p->val){ treap_insert(p->left,value); if (p->left->fix<p->fix) trr(p); } if (value>p->val){ treap_insert(p->right,value); if (p->right->fix<p->fix) tlr(p); } } p->Maintain(); } void del(treap_node *&p,int d){ if (p->val==d){ if (p->wgt==1){ if (!p->left||!p->right){ if (!p->left) p=p->right; else p=p->left; } else{ if (p->left->fix<p->right->fix){ trr(p); del(p->right,d); } else{ tlr(p); del(p->left,d); } } } else p->wgt--; } else{ if (d<p->val) del(p->left,d); if (d>p->val) del(p->right,d); } if (p!=NULL) p->Maintain(); } int treap_rank(treap_node *p,int value,int cnt){ int t=p->lsize(); if(value==p->val) return t+cnt+1; else if(value<p->val) return treap_rank(p->left,value,cnt); else return treap_rank(p->right,value,t+cnt+p->wgt); } treap_node *Treap_kth(treap_node *&p,int k){ if (k<p->lsize()+1) return Treap_kth(p->left,k); else if (k>p->lsize()+p->wgt) return Treap_kth(p->right,k-p->lsize()-p->wgt); else return p; } int main(){ int n,a,b; while(scanf("%d",&n)!=-1){ int sum1=0,sum2=0,ans=0; for(int i=0;i<n;i++){ scanf("%d%d",&a,&b); if(a==0){ sum1++;treap_insert(root,b); } if(a==1){ sum2++;treap_insert(root,b); } if(sum1!=0&&sum2!=0){ int k=treap_rank(root,b,0); treap_node *t1=NULL,*t2=NULL; if(k!=1) t1=Treap_kth(root,k-1); if(k!=(sum1+sum2)) t2=Treap_kth(root,k+1); if(!t1){ ans=(ans+(abs(t2->val-b)))%mod; sum1--;sum2--; del(root,t2->val);del(root,b); }else if(!t2){ ans=(ans+(abs(t1->val-b)))%mod; sum1--;sum2--; del(root,t1->val);del(root,b); }else{ if(abs(t1->val-b)<abs(t2->val-b)){ ans=(ans+(abs(t1->val-b)))%mod; sum1--;sum2--; del(root,t1->val);del(root,b); }else if(abs(t1->val-b)>abs(t2->val-b)){ ans=(ans+(abs(t2->val-b)))%mod; sum1--;sum2--; del(root,t2->val);del(root,b); }else{ if(t1->val<t2->val){ ans=(ans+(abs(t1->val-b)))%mod; sum1--;sum2--; del(root,t1->val);del(root,b); }else{ ans=(ans+(abs(t2->val-b)))%mod; sum1--;sum2--; del(root,t2->val);del(root,b); } } } } } printf("%d\n",ans); } return 0; }