題目
平衡樹的簡單應用,刪除,求前驅和後繼。
一般來說,會建兩顆線段樹,但事實上,題目可得,同一時間內,只會有寵物或人,所以,只要一顆就夠了。
#include
#define n 80000
#define mod 1000000
using
namespace
std;
int ch[n+1][2],siz[n+1],cnt[n+1],f[n+1],key[n+1],sz,rt;
int n,opt,x,ans,tmp1,tmp2,now,flag,num,mi,id;
inline
char nc()
inline
int read()
inline
void clear(int x)
inline
int get(int x)
inline
void update(int x)
inline
void rotate(int x)
inline
void splay(int x)
inline
void insert(int x)
int now=rt,fa=0;
while(true)
fa=now;
now=ch[now][key[now]if(now)continue;
sz++;clear(sz);
key[sz]=x,cnt[sz]=1,siz[sz]=1;
f[sz]=fa;ch[fa][key[fa]return;
}
}inline
int pre()
inline
int suf()
inline
int find(int x)
ans+=cnt[now];
now=ch[now][1];}}
}inline
int findx(int x)
}}inline
void del(int x)
if(!ch[rt][0]&&!ch[rt][1])
if(!ch[rt][0])
if(!ch[rt][1])
int oldrt=rt,leftbig=pre();
splay(leftbig);
ch[rt][1]=ch[oldrt][1];
f[ch[oldrt][1]]=rt;
clear(oldrt);
return;
}int main()
if(!flag)insert(x),num++;
else
mi=~0u>>1;
insert(x);
tmp1=pre(),tmp2=suf();
if(tmp1&&abs(x-key[tmp1])abs(x-key[tmp1]),id=tmp1;
if(tmp2&&abs(x-key[tmp2])abs(x-key[tmp2]),id=tmp2;
ans=(ans+mi)%mod;
del(x);
del(key[id]);
num--;}}
cout
bzoj1208 HNOI2004 寵物收養所
description 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿q根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養所...
BZOJ1208 HNOI2004 寵物收養所
time limit 10 sec memory limit 162 mb submit 12554 solved 5187 submit status discuss 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵...
bzoj1208 HNOI2004 寵物收養所
最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿q根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養所的寵物乙個特點值。這樣他...