记录编号 |
489434 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2004] 宠物收养所 |
最终得分 |
100 |
用户昵称 |
CSU_Turkey |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.386 s |
提交时间 |
2018-03-02 15:02:07 |
内存使用 |
1.29 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int inf=8e4+10;
const int mod=1e6;
const double alpha=0.75;
LL ans;
int ls[inf],rs[inf],siz[inf],val[inf];
int n,sz,rt;
int p[inf],cnt;
int flag=-1;
int id,f;
void update(int x){
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
}
int rebuild(int l,int r){
if(l>r)return 0;
int mid=(l+r)>>1;
int x=p[mid];
siz[x]=1;
ls[x]=rebuild(l,mid-1);
rs[x]=rebuild(mid+1,r);
update(x);
return x;
}
void insert(int &x,int y){
if(!x){
x=++sz;
siz[x]=1;
val[x]=y;
return ;
}
if(y<val[x])insert(ls[x],y);
else insert(rs[x],y);
update(x);
if(max(siz[ls[x]],siz[rs[x]])>alpha*siz[x])id=x;
if(ls[x]==id || rs[x]==id)f=x;
}
void dfs(int x){
if(ls[x])dfs(ls[x]);
p[++cnt]=x;
if(rs[x])dfs(rs[x]);
}
void work(int x){
id=-1;
insert(rt,x);
if(id!=-1){
if(id==rt)f=0;
cnt=0;
dfs(id);
int u=rebuild(1,cnt);
if(ls[f]==id)ls[f]=u;
else if(rs[f]==id)rs[f]=u;
else rt=u;
}
}
void del(int &x,int y){
if(val[x]==y){
if((!ls[x]) && (!rs[x]))x=0;
else if(!ls[x])x=rs[x];
else if(!rs[x])x=ls[x];
else {
int tmp=ls[x];
while(rs[tmp])tmp=rs[tmp];
val[x]=val[tmp];
del(ls[x],val[x]);
update(x);
}
return ;
}
if(y<val[x])del(ls[x],y);
else del(rs[x],y);
update(x);
}
int pre(int x,int y,int Max){
if(!x)return Max;
if(val[x]<=y){
Max=max(Max,val[x]);
return pre(rs[x],y,Max);
}
else return pre(ls[x],y,Max);
}
int succ(int x,int y,int Min){
if(!x)return Min;
if(val[x]>=y){
Min=min(Min,val[x]);
return succ(ls[x],y,Min);
}
else return succ(rs[x],y,Min);
}
int main()
{
freopen("pet.in","r",stdin);
freopen("pet.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
if(flag==-1){
work(y);
flag=x;
}
else if(flag==x){
work(y);
}
else {
int tmp1=pre(rt,y,-0x3fffffff),tmp2=succ(rt,y,0x3fffffff);
if(tmp2-y<y-tmp1){
del(rt,tmp2);
ans+=tmp2-y;
ans%=mod;
}
else {
del(rt,tmp1);
ans+=y-tmp1;
ans%=mod;
}
if(!siz[rt])flag=-1;
}
}
printf("%lld\n",ans);
return 0;
}