bzoj1208: [HNOI2004]宠物收养所 (sbt)

切傻逼题还能wa那么多次我也是醉了

好啦其实是sbt都不会敲了(一直用神器treap)

重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的……

还是treap大法好&……

题解还用写么?就是找前驱找后继然后判断一下

const
  maxn=300000;
  mm=1<<28;
  mmm=1000000;

var
  left,right,value,s:array[0..maxn]of longint;
  ans,n,m,i,j,k,l,t,tot,now:longint;

function min(x,y:longint):longint;
begin
  if x<y then exit(x);
  exit(y);
end;

function max(x,y:longint):longint;
begin
  if x<y then exit(y);
  exit(x);
end;

procedure lt(var x:longint);
var
  k:longint;
begin
  k:=right[x];
  right[x]:=left[k];
  left[k]:=x;
  s[k]:=s[x];
  s[x]:=s[left[x]]+1+s[right[x]];
  x:=k;
end;

procedure rt(var x:longint);
var
  k:longint;
begin
  k:=left[x];
  left[x]:=right[k];
  right[k]:=x;
  s[k]:=s[x];
  s[x]:=s[left[x]]+1+s[right[x]];
  x:=k;
end;

procedure maintain(var t:longint);
begin
  if s[left[left[t]]]>s[right[t]] then begin
    rt(t);
    maintain(right[t]);
    maintain(t);
    exit;
  end;
  if s[right[left[t]]]>s[right[t]] then begin
    lt(left[t]);
    rt(t);
    maintain(left[t]);
    maintain(right[t]);
    maintain(t);
    exit;
  end;
  if s[right[right[t]]]>s[left[t]] then begin
    lt(t);
    maintain(left[t]);
    maintain(t);
    exit;
  end;
  if s[left[right[t]]]>s[left[t]] then begin
    rt(right[t]);
    lt(t);
    maintain(left[t]);
    maintain(right[t]);
    maintain(t);
    exit;
  end;
end;

procedure insert(var t:longint;x:longint);
begin
  if t=0 then begin
    inc(tot);
    t:=tot;
    left[t]:=0;
    right[t]:=0;
    value[t]:=x;
    s[t]:=1;
    exit;
  end;
  inc(s[t]);
  if x<=value[t] then insert(left[t],x)
    else insert(right[t],x);
  maintain(t);
end;

function delete(var t:longint;x:longint):longint;
begin
  dec(s[t]);
  if (x=value[t]) or (x<value[t]) and (left[t]=0) or (x>value[t]) and (right[t]=0) then begin
    delete:=value[t];
    if (left[t]=0) or (right[t]=0) then t:=left[t]+right[t]
    else
      value[t]:=delete(left[t],value[t]+1);
  end
  else
    if x<value[t] then  delete:=delete(left[t],x)
      else delete:=delete(right[t],x);
end;

function pred(t,x:longint):longint;
begin
  if t=0 then exit(-mm);
  if value[t]=x then exit(x);
  if value[t]>x then exit(pred(left[t],x))
  else
    exit(max(value[t],pred(right[t],x)));
end;

function succ(t,x:longint):longint;
begin
  if t=0 then exit(mm);
  if value[t]=x then exit(x);
  if value[t]<x then exit(succ(right[t],x))
  else
    exit(min(value[t],succ(left[t],x)));
end;

begin
  readln(n);
  now:=0;
  ans:=0;
  t:=0;
  while n>0 do begin
    dec(n);
    readln(i,j);
    if i=0 then begin
      if now>=0 then
        insert(t,j)
      else begin
        k:=pred(t,j);
        l:=succ(t,j);
        if j-k<=l-j then begin
          ans:=(ans+j-k)mod mmm;
          delete(t,k);
        end
        else begin
          ans:=(ans+l-j)mod mmm;
          delete(t,l);
        end;
      end;
      inc(now);
    end
    else begin
      if now>0 then begin
        k:=pred(t,j);
        l:=succ(t,j);
        if j-k<=l-j then begin
          ans:=(ans+j-k)mod mmm;
          delete(t,k);
        end
        else begin
          ans:=(ans+l-j) mod mmm;
          delete(t,l);
        end;
      end
      else insert(t,j);
      dec(now);
    end;
  end;
  writeln(ans);
  readln;
  readln;
end.

时间: 2024-08-07 04:13:56

bzoj1208: [HNOI2004]宠物收养所 (sbt)的相关文章

[bzoj1208][HNOI2004]宠物收养所

题目好长啊直接copy算了 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领

BZOJ1208: [HNOI2004]宠物收养所 平衡树 Treap 模板题

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被 主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希 望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程 了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个

[bzoj1208][HNOI2004][宠物收养所] (平衡树)

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领养者

【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: 1 #include<cstdio> 2 #include<ext/pb_ds/assoc_container.hpp> 3 #include<ext/pb_ds/tree_policy.hpp> 4 using namespace std; 5 using namespace __

【权值分块】bzoj1208 [HNOI2004]宠物收养所

不多说.比pb_ds还是要快不少的. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 #define N 80001 6 int sum,sz,num[N],l[295],r[295],a[N],op[N],en,ma[N],ans,n; 7 inline void R(int &x){ 8 char c=0;int f=1; 9 for(;c

BZOJ 题目1208: [HNOI2004]宠物收养所(SBT)

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5440  Solved: 2093 [Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<

BZOJ 1208: [HNOI2004]宠物收养所

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^

bzoj 1208: [HNOI2004]宠物收养所 set

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^

【BZOJ-1208】宠物收养所 Splay

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6638  Solved: 2601[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^