我的代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e6;
int opt,q,rt,l,r,px,tot=0,ans=0,cnt=0;
struct node{
int l,r,siz,val,randval;
}Treap[1145141];
void pushup(int p){
Treap[p].siz=Treap[Treap[p].l].siz+Treap[Treap[p].r].siz+1;
return ;
}
void build(int x){
++cnt;
Treap[cnt].l=Treap[cnt].r=0;
Treap[cnt].siz=1;
Treap[cnt].val=x;
Treap[cnt].randval=rand()%1919810;
return ;
}
void Split(int p,int val,int &l,int &r){
if(!p){
l=r=0;
return ;
}
if(Treap[p].val<=val){
l=p;
Split(Treap[p].r,val,Treap[p].r,r);
}else{
r=p;
Split(Treap[p].l,val,l,Treap[p].l);
}
pushup(p);
return ;
}
int Merge(int l,int r){
if(!l||!r) return l+r;
if(Treap[l].randval<=Treap[r].randval){
Treap[l].r=Merge(Treap[l].r,r);
pushup(l);
return l;
}
Treap[r].l=Merge(l,Treap[r].l);
pushup(r);
return r;
}
void Insert(int x){
Split(rt,x,l,r);
build(x);
rt=Merge(Merge(l,cnt),r);
return ;
}
void Delete(int x){
Split(rt,x,l,r);
Split(l,x-1,l,px);
px=Merge(Treap[px].l,Treap[px].r);
rt=Merge(Merge(l,px),r);
return ;
}
void rank_query(int x){
Split(rt,x-1,l,r);
cout<<Treap[l].siz+1<<endl;
rt=Merge(l,r);
return ;
}
int pre(int x){
Split(rt,x-1,l,r);
int now=l;
while(Treap[now].r) now=Treap[now].r;
int qans=Treap[now].val;
rt=Merge(l,r);
return qans;
}
int nxt(int x){
Split(rt,x,l,r);
int now=r;
while(Treap[now].l) now=Treap[now].l;
int qans=Treap[now].val;
rt=Merge(l,r);
return qans;
}
signed main(){
srand(20111019);
cin>>q;
while(q--){
int op,x;
cin>>op>>x;
if(!tot||op==opt){
++tot;
Insert(x);
opt=op;
}
else{
--tot;
int qq=0;
int qwq=pre(x);
int qaq=nxt(x);
if(!qwq&&qaq){
qq=abs(qaq-x);
Delete(qaq);
}
else if(qwq&&!qaq){
qq=abs(qwq-x);
Delete(qwq);
}
else if(qwq&&qaq){
if(abs(qwq-x)<=abs(qaq-x)){
qq=abs(qwq-x);
Delete(qwq);
}
else{
qq=abs(qaq-x);
Delete(qaq);
}
}
ans=(ans+qq)%mod;
}
}
cout<<ans<<endl;
return 0;
}
HACK:
输入:
5
0 2
0 4
1 2
1 3
1 5
正确输出:
1
错误输出:
3