题目传送门
我好弱啊我连伸展树模版都打错。
解法:
来一个人就领走宠物。
来一个宠物就被人领走。
那么树上某一个时刻要么全部都是人要么全部都是宠物。。
所以我们放心的求值就可以了。
没学过伸展树的自己去学吧。
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
int n,c,f,d,son[2];
}tr[110000];int len;
const int mod=1000000;
void update(int x) {
int lc=tr[x].son[0],rc=tr[x].son[1];
tr[x].c=tr[lc].c+tr[rc].c+tr[x].n;
}
void add(int d,int f) {
len++;
tr[len].d=d;tr[len].f=f;tr[len].n=tr[len].c=1;
if(d<tr[f].d)
tr[f].son[0]=len;
else
tr[f].son[1]=len;
tr[len].son[0]=tr[len].son[1]=0;
}
void rotate(int x,int w) {
int f=tr[x].f,ff=tr[f].f;
int r,R;
r=tr[x].son[w];R=f;
tr[R].son[1-w]=r;
if(r!=0)
tr[r].f=R;
r=x;R=ff;
if(tr[R].son[0]==f)
tr[R].son[0]=r;
else
tr[R].son[1]=r;
tr[r].f=R;
r=f;R=x;
tr[R].son[w]=r;
tr[r].f=R;
update(f);update(x);
}
int root;
void splay(int x,int rt) {
while(tr[x].f!=rt) {
int f=tr[x].f,ff=tr[f].f;
if(ff==rt) {
if(tr[f].son[0]==x)
rotate(x,1);
else
rotate(x,0);
}
else {
if(tr[f].son[0]==x&&tr[ff].son[0]==f) {
rotate(f,1);rotate(x,1);
}
else if(tr[f].son[1]==x&&tr[ff].son[1]==f) {
rotate(f,0);rotate(x,0);
}
else if(tr[f].son[0]==x&&tr[ff].son[1]==f) {
rotate(x,1);rotate(x,0);
}
else if(tr[f].son[1]==x&&tr[ff].son[0]==f) {
rotate(x,0);rotate(x,1);
}
}
}
if(rt==0)
root=x;
}
int findip(int d) {
int x=root;
while(tr[x].d!=d) {
if(d<tr[x].d) {
if(tr[x].son[0]==0)
break;
x=tr[x].son[0];
}
else {
if(tr[x].son[1]==0)
break;
x=tr[x].son[1];
}
}
return x;
}
void ins(int d) {
if(root==0) {
add(d,0);root=len;
return ;
}
int x=findip(d);
if(tr[x].d==d) {
tr[x].n++;
update(x);
splay(x,0);
}
else {
add(d,x);
update(x);
splay(len,0);
}
}
void del(int d) {
int x=findip(d);splay(x,0);
if(tr[x].n>1) {
tr[x].n--;update(x);
return ;
}
if(tr[x].son[0]==0&&tr[x].son[1]==0) {
root=0;len=0;
}
else if(tr[x].son[0]==0&&tr[x].son[1]!=0) {
root=tr[x].son[1];tr[root].f=0;
}
else if(tr[x].son[0]!=0&&tr[x].son[1]==0) {
root=tr[x].son[0];tr[root].f=0;
}
else {
int p=tr[x].son[0];
while(tr[p].son[1]!=0)
p=tr[p].son[1];
splay(p,x);
int r,R;
r=tr[x].son[1];R=p;
tr[R].son[1]=r;
tr[r].f=R;
root=R;tr[R].f=0;
update(R);
}
}
int findqianqu(int d) {
int x=findip(d);splay(x,0);
if(d<tr[x].d&&tr[x].son[0]!=0) {
x=tr[x].son[0];
while(tr[x].son[1]!=0)
x=tr[x].son[1];
}
if(d<tr[x].d)
x=0;
return tr[x].d;
}
int findhouji(int d) {
int x=findip(d);splay(x,0);
if(d>tr[x].d&&tr[x].son[1]!=0) {
x=tr[x].son[1];
while(tr[x].son[0]!=0)
x=tr[x].son[0];
}
if(d>tr[x].d)
x=0;
return tr[x].d;
}
int main() {
int n;scanf("%d",&n);len=root=0;
int ren=0,chong=0,ans=0;
for(int i=1;i<=n;i++) {
int t,x;scanf("%d%d",&t,&x);
if(t==0) {
if(ren<=chong)
ins(x);
else {
int l=findqianqu(x),r=findhouji(x);
if(l==0&&r!=0) {
ans=(ans+r-x)%mod;
del(r);
}
else if(l!=0&&r==0) {
ans=(ans+x-l)%mod;
del(l);
}
else if(l!=0&&r!=0) {
if(x-l<=r-x) {
ans=(ans+x-l)%mod;
del(l);
}
else {
ans=(ans+r-x)%mod;
del(r);
}
}
}
chong++;
}
else {
if(ren>=chong)
ins(x);
else {
int l=findqianqu(x),r=findhouji(x);
if(l==0&&r!=0) {
ans=(ans+r-x)%mod;
del(r);
}
else if(l!=0&&r==0) {
ans=(ans+x-l)%mod;
del(l);
}
else if(l!=0&&r!=0) {
if(x-l<=r-x) {
ans=(ans+x-l)%mod;
del(l);
}
else {
ans=(ans+r-x)%mod;
del(r);
}
}
}
ren++;
}
}
printf("%d\n",ans);
return 0;
}
不给注释了不想写。