zoukankan      html  css  js  c++  java
  • BZOJ1901: Zju2112 Dynamic Rankings

    1901: Zju2112 Dynamic Rankings

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 4231  Solved: 1764
    [Submit][Status]

    Description

    给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。 第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

    Input

    对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

    Output

     

    Sample Input

    5 3
    3 2 1 4 7
    Q 1 4 3
    C 2 6
    Q 2 5 3

    Sample Output

    3
    6

    HINT

    20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

    Source

    题解:

    写的很好写,尼玛怎么就是WA!和暴力对拍了没发现问题啊!

    ps:自己要来了数据,本机测AC,bzoj上还是WA,只好上lyd的代码了。。。

    代码:

      1 const maxn=50000+1000;
      2 type node=record
      3      l,r,lch,rch,rt,mid:longint;
      4      end;
      5 var t:array[0..4*maxn] of node;
      6     l,r,s,w,rnd,v,a:array[0..16*maxn] of longint;
      7     i,n,m,x,y,z,tot:longint;
      8     ch:char;
      9 procedure pushup(k:longint);
     10  begin
     11    s[k]:=s[l[k]]+s[r[k]]+w[k];
     12  end;
     13 procedure rturn(var k:longint);
     14  var t:longint;
     15  begin
     16    t:=l[k];l[k]:=r[t];r[t]:=k;s[t]:=s[k];pushup(k);k:=t;
     17  end;
     18 procedure lturn(var k:longint);
     19  var t:longint;
     20  begin
     21    t:=r[k];r[k]:=l[t];l[t]:=k;s[t]:=s[k];pushup(k);k:=t;
     22  end;
     23 procedure ins(var k,num:longint);
     24  begin
     25   if k=0 then
     26    begin
     27     inc(tot);k:=tot;v[k]:=num;s[k]:=1;w[k]:=1;l[k]:=0;r[k]:=0;
     28     rnd[k]:=random(maxlongint);exit;
     29    end;
     30   inc(s[k]);
     31   if num=v[k] then inc(w[k])
     32   else if num<v[k] then begin ins(l[k],num);if rnd[l[k]]<rnd[k] then rturn(k);end
     33   else begin ins(r[k],num);if rnd[r[k]]<rnd[k] then lturn(k);end;
     34  end;
     35 procedure del(var k,num:longint);
     36  begin
     37   if v[k]=num then
     38    begin
     39     if w[k]>1 then begin dec(w[k]);dec(s[k]);exit;end;
     40     if l[k]*r[k]=0 then k:=l[k]+r[k]
     41     else if rnd[l[k]]<rnd[r[k]] then begin rturn(k);del(k,num);end
     42     else begin lturn(k);del(k,num);end;
     43     exit;
     44    end;
     45   dec(s[k]);
     46   if num<v[k] then del(l[k],num) else del(r[k],num);
     47  end;
     48 procedure build(k,x,y:longint);
     49  var i:longint;
     50  begin
     51   with t[k] do
     52    begin
     53      l:=x;r:=y;mid:=(l+r)>>1;
     54      for i:=l to r do ins(rt,a[i]);
     55      if l=r then exit;
     56      lch:=k<<1;rch:=k<<1+1;
     57      build(lch,l,mid);build(rch,mid+1,r);
     58    end;
     59  end;
     60 procedure print(x:longint);
     61  begin
     62  if x=0 then exit;
     63  print(l[x]);
     64  write(x,' ',v[x],'!');
     65  print(r[x]);
     66  end;
     67 procedure change(k,x,y:longint);
     68  begin
     69   with t[k] do
     70    begin
     71      del(rt,a[x]);ins(rt,y);
     72      if l=r then exit;
     73      if x<=mid then change(lch,x,y)
     74      else change(rch,x,y);
     75    end;
     76  end;
     77 function rank(k,num:longint):longint;
     78  begin
     79   if k=0 then exit(0);
     80   if num=v[k] then exit(s[l[k]])
     81   else if num<v[k] then exit(rank(l[k],num))
     82   else exit(s[l[k]]+w[k]+rank(r[k],num));
     83  end;
     84 function query(k,x,y,num:longint):longint;
     85  begin
     86   with t[k] do
     87    begin
     88     if (l=x) and (r=y) then exit(rank(rt,num));
     89     if y<=mid then exit(query(lch,x,y,num))
     90     else if x>mid then exit(query(rch,x,y,num))
     91     else exit(query(lch,x,mid,num)+query(rch,mid+1,y,num));
     92    end;
     93  end;
     94 procedure solvechange;
     95  begin
     96   readln(x,y);
     97   change(1,x,y);
     98   a[x]:=y;
     99  end;
    100 procedure solveask;
    101  var l,r,mid:longint;
    102  begin
    103   readln(x,y,z);
    104   l:=0;r:=1000000000;
    105   while l<=r do
    106    begin
    107      mid:=(l+r)>>1;
    108      if query(1,x,y,mid)+1>z then r:=mid-1 else l:=mid+1;
    109    end;
    110   writeln(r);
    111  end;
    112 procedure init;
    113  begin
    114   tot:=0;
    115   readln(n,m);
    116   for i:=1 to n do read(a[i]);readln;
    117   build(1,1,n);
    118  end;
    119 procedure main;
    120  begin
    121   for i:=1 to m do
    122    begin
    123      read(ch);
    124      case ch of
    125      'C':solvechange;
    126      'Q':solveask;
    127      end;
    128    end;
    129  end;
    130 begin
    131   assign(input,'input.txt');assign(output,'output.txt');
    132   reset(input);rewrite(output);
    133   init;
    134   main;
    135   close(input);close(output);
    136 end.                      
    View Code
  • 相关阅读:
    WebGL编程指南案例解析之绘制一个点
    在pixi中使用你的自定义着色器
    一个关于运维人员做事的很好的case,拿出来和大家共勉
    2015小目标
    在工作中修行
    ROW模式的SQL无法正常同步的问题总结
    从周末教儿子学溜冰联想到带人
    group_concat函数导致的主从同步异常
    招聘运维工程师
    一个锁的奇怪问题分析总结
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3913192.html
Copyright © 2011-2022 走看看