题意:不描述了
思路:我们只需要一个树就可以,输入一个数就存进去,当人和动物都大于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;
}