#9 死循环过不起啊!
代码都是照着模板打的啊
代码:
#include<bits/stdc++.h>
#define N 80010
#define mod 1000000
#define inf 2147483647
#define ls s[0]
#define rs s[1]
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
int n,check,ans,a,b,root,pre1,pre2,cnt,cur;
struct node{
int s[2],val,f;
}p[N];
void rotate(int x){
int y=p[x].f,z=p[y].f,k=p[y].rs==x;
p[z].s[p[z].rs==y]=x,p[x].f=z;
p[y].s[k]=p[x].s[k^1],p[p[x].s[k^1]].f=y;
p[x].s[k^1]=y,p[y].f=x;
}
void Splay(int x,int goal){
int y,z;
while(p[x].f!=goal){
y=p[x].f,z=p[y].f;
if(z!=goal){
if((p[y].ls==x)^(p[z].ls==y)){
rotate(x);
}
else{
rotate(y);
}
}
rotate(x);
}
if(!goal){
root=x;
}
}
void insert(int x){
int u=root,f=0;
while(u&&p[u].val!=x){
f=u,u=p[u].s[x>p[u].val];
}
if(!u){
u=++cnt;
if(f){
p[f].s[x>p[f].val]=u;
}
p[cnt].ls=p[cnt].rs=0,p[cnt].f=f,p[cnt].val=x;
}
Splay(u,0);
}
void find(int x){
int u=root;
if(!u){
return;
}
while(p[u].s[x>p[u].val]&&x!=p[u].val){
u=p[u].s[x>p[u].val];
}
Splay(u,0);
}
int Next(int x,int f){
find(x);
int u=root;
if((x>p[u].val&&!f)||(x<p[u].val&&f)){
return u;
}
u=p[u].s[f];
while(p[u].s[f^1]){
u=p[u].s[f^1];
}
return u;
}
void Delete(int x){
int a=Next(x,0),b=Next(x,1);
Splay(a,0),Splay(b,a);
p[b].ls=0;
}
int main(){
n=read();
insert(-inf),insert(inf);
while(n--){
a=read(),b=read();
if(!check){
cur=a,check++;
insert(b);
}
else if(!(a^cur)){
check++;
insert(b);
}
else{
pre1=p[Next(b,0)].val,pre2=p[Next(b,1)].val;
if(abs(pre1-b)<=abs(pre2-b)){
ans+=abs(pre1-b);
Delete(pre1);
}
else{
ans+=abs(pre2-b);
Delete(pre2);
}
ans%=mod,check--;
}
}
printf("%d",ans);
return 0;
}
qwq