zoukankan      html  css  js  c++  java
  • 【Tyvj1601】魔兽争霸(主席树,树套树)

    题意:要求在N个数的序列中支持以下操作:

    1:将第X个元素加上Y

    2:询问当前K大值

    n<=30000,m<=50000

    思路:树状数组套主席树

    Tyvj又炸了,还不知道对不对

      1 var t:array[0..12000000]of record
      2                            l,r,s:longint;
      3                           end;
      4     d:array[1..50000,1..3]of longint;
      5     a,save,q,root,hash:array[0..100000]of longint;
      6     b:array[1..200000]of longint;
      7     n,m,i,j,x,cnt,u,que,s,sum,tmp,len:longint;
      8     ch:string;
      9 
     10 function lowbit(x:longint):longint;
     11 begin
     12  exit(x and (-x));
     13 end;
     14 
     15 procedure update(l,r:longint;var p:longint;x,v:longint);
     16 var mid:longint;
     17 begin
     18  inc(cnt); t[cnt]:=t[p];
     19  p:=cnt; t[p].s:=t[p].s+v;
     20  if l=r then exit;
     21  mid:=(l+r)>>1;
     22  if x<=mid then update(l,mid,t[p].l,x,v)
     23   else update(mid+1,r,t[p].r,x,v);
     24 end;
     25 
     26 function query(l,r,k:longint):longint;
     27 var mid,s,i:longint;
     28 begin
     29  if l=r then exit(l);
     30  s:=0;
     31  mid:=(l+r)>>1;
     32  for i:=1 to len do s:=s+t[t[q[i]].l].s;
     33  if s>=k then
     34  begin
     35   for i:=1 to len do q[i]:=t[q[i]].l;
     36   exit(query(l,mid,k));
     37  end
     38   else
     39   begin
     40    for i:=1 to len do q[i]:=t[q[i]].r;
     41    exit(query(mid+1,r,k-s));
     42   end;
     43 end;
     44 
     45 procedure swap(var x,y:longint);
     46 var t:longint;
     47 begin
     48  t:=x; x:=y; y:=t;
     49 end;
     50 
     51 procedure qsort(l,r:longint);
     52 var i,j,mid:longint;
     53 begin
     54  i:=l; j:=r; mid:=b[(l+r)>>1];
     55  repeat
     56   while mid<b[i] do inc(i);
     57   while mid>b[j] do dec(j);
     58   if i<=j then
     59   begin
     60    swap(b[i],b[j]);
     61    inc(i); dec(j);
     62   end;
     63  until i>j;
     64  if l<j then qsort(l,j);
     65  if i<r then qsort(i,r);
     66 end;
     67 
     68 function find(x:longint):longint;
     69 var l,r,mid:longint;
     70 begin
     71  l:=1; r:=u;
     72  while l<=r do
     73  begin
     74   mid:=(l+r)>>1;
     75   if hash[mid]=x then exit(mid);
     76   if hash[mid]>x then l:=mid+1
     77    else r:=mid-1;
     78  end;
     79 end;
     80 
     81 begin
     82  assign(input,'tyvj1601.in'); reset(input);
     83  assign(output,'tyvj1601.out'); rewrite(output);
     84  readln(n);
     85  for i:=1 to n do
     86  begin
     87   read(a[i]); b[i]:=a[i];
     88  end;
     89  que:=n;
     90  for i:=1 to n do save[i]:=a[i];
     91  readln(m);
     92  for i:=1 to m do
     93  begin
     94   readln(ch); x:=0;
     95   if ch[1]='Q' then
     96   begin
     97    for j:=3 to length(ch) do x:=x*10+ord(ch[j])-ord('0');
     98    d[i,1]:=1; d[i,2]:=x; continue;
     99   end;
    100   d[i,1]:=2; s:=2;
    101   for j:=3 to length(ch) do
    102   begin
    103    if ch[j]=' ' then inc(s)
    104     else d[i,s]:=d[i,s]*10+ord(ch[j])-ord('0');
    105   end;
    106   if ch[1]='A' then d[i,3]:=-d[i,3];
    107  end;
    108  for i:=1 to m do
    109   if d[i,1]=2 then
    110   begin
    111    a[d[i,2]]:=a[d[i,2]]+d[i,3];
    112    if a[d[i,2]]>0 then
    113    begin
    114     inc(que); b[que]:=a[d[i,2]];
    115    end;
    116   end;
    117  qsort(1,que);
    118  hash[1]:=b[1]; u:=1;
    119  for i:=2 to que do
    120   if b[i]<>b[i-1] then begin inc(u); hash[u]:=b[i]; end;
    121  sum:=n;
    122  for i:=1 to n do
    123  begin
    124   tmp:=find(save[i]);
    125   j:=i;
    126   while j<=n do
    127   begin
    128    update(1,u,root[j],tmp,1);
    129    j:=j+lowbit(j);
    130   end;
    131  end;
    132  for i:=1 to m do
    133   if d[i,1]=1 then
    134   begin
    135    len:=0; j:=n;
    136    while j>0 do
    137    begin
    138     inc(len); q[len]:=root[j];
    139     j:=j-lowbit(j);
    140    end;
    141    if sum<d[i,2] then writeln(-1)
    142     else writeln(hash[query(1,u,d[i,2])]);
    143   end
    144    else
    145    begin
    146     tmp:=find(save[d[i,2]]);
    147     j:=d[i,2];
    148     while j<=n do
    149     begin
    150      update(1,u,root[j],tmp,-1);
    151      j:=j+lowbit(j);
    152     end;
    153     save[d[i,2]]:=save[d[i,2]]+d[i,3];
    154     if save[d[i,2]]>0 then
    155     begin
    156      tmp:=find(save[d[i,2]]);
    157      j:=d[i,2];
    158      while j<=n do
    159      begin
    160       update(1,u,root[j],tmp,1);
    161       j:=j+lowbit(j);
    162      end;
    163     end
    164      else dec(sum);
    165    end;
    166 
    167  writeln(sum);
    168  close(input);
    169  close(output);
    170 end.
  • 相关阅读:
    UIWebView控件中 字体大小和字体样式的修改
    IOS statusBarStyle 设置
    SSZipArchive解压失败的原因
    uiimageview 的 animation 动画
    App网络管理
    系统日志输出工具类
    软键盘管理
    获取App应用信息
    Activity管理类
    SharePreference工具类
  • 原文地址:https://www.cnblogs.com/myx12345/p/6208615.html
Copyright © 2011-2022 走看看