传送门
直接上set暴力二分不虚。
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
set<int> s;
int n,x,y,t,ans;
void ask(int x){
set<int>::iterator l=--s.lower_bound(x),r=s.lower_bound(x);
if (x-*l<=*r-x&&*l!=-inf){
ans+=x-*l;
s.erase(l);
}
else{
ans+=*r-x;
s.erase(r);
}
ans%=1000000;
}
int main(){
s.insert(inf);
s.insert(-inf);
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
if (s.size()==2) t=x;
if (x==t) s.insert(y);
else ask(y);
}
printf("%d",ans);
return 0;
}
或者用平衡树查询答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define N 100005
using namespace std;
long long ans;
int n,sz,rt,kd,t1,t2,x,f;
int t[N][2],num[N],fa[N];
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if (t[y][0]==x) l=0; else l=1;
r=l^1;
if (y==k) k=x;
else if (t[z][0]==y) t[z][0]=x;
else t[z][1]=x;
fa[x]=z;
fa[y]=x;
fa[t[x][r]]=y;
t[y][l]=t[x][r];
t[x][r]=y;
}
void splay(int x,int &k){
int y,z;
while (x!=k){
y=fa[x]; z=fa[y];
if (y!=k){
if ((t[y][0]==x)^(t[z][0]==y)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void ins(int &k,int x,int last){
if (!k){
k=++sz;
num[k]=x;
fa[k]=last;
splay(k,rt);
return;
}
if (x<num[k]) ins(t[k][0],x,k);
else ins(t[k][1],x,k);
}
void del(int x){
splay(x,rt);
if (t[x][0]*t[x][1]==0) rt=t[x][0]+t[x][1];
else{
int k=t[x][1];
while (t[k][0]) k=t[k][0];
t[k][0]=t[x][0];
fa[t[x][0]]=k;
rt=t[x][1];
}
fa[rt]=0;
}
void pro(int k,int x){
for (;k;)
if (num[k]<=x) t1=k,k=t[k][1];
else k=t[k][0];
}
void suc(int k,int x){
for (;k;)
if (num[k]>=x) t2=k,k=t[k][0];
else k=t[k][1];
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&f,&x);
if (!rt) kd=f,ins(rt,x,0);
else if (f==kd) ins(rt,x,0);
else{
t1=t2=-1;
pro(rt,x); suc(rt,x);
if (t1==-1){ans=(ans+num[t2]-x)%1000000; del(t2);}
else if (t2==-1){ans=(ans+x-num[t1])%1000000; del(t1);}
else if (x-num[t1]>num[t2]-x)
{ans=(ans+num[t2]-x)%1000000; del(t2);}
else {ans=(ans+x-num[t1])%1000000; del(t1);}
}
}
printf("%lld",ans);
}