BZOJ1901: Zju2112 Dynamic Rankings
2014-08-14 18:19
197 查看
1901: Zju2112 Dynamic Rankings
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4231 Solved: 1764
[Submit][Status]
Description
给定一个含有n个数的序列a[1],a[2],a[3]……a,程序必须回答这样的询问:对于给定的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
,这些数都小于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 33 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
36
HINT
20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。Source
题解:写的很好写,尼玛怎么就是WA!和暴力对拍了没发现问题啊!
ps:自己要来了数据,本机测AC,bzoj上还是WA,只好上lyd的代码了。。。
代码:
const maxn=50000+1000; type node=record l,r,lch,rch,rt,mid:longint; end; var t:array[0..4*maxn] of node; l,r,s,w,rnd,v,a:array[0..16*maxn] of longint; i,n,m,x,y,z,tot:longint; ch:char; procedure pushup(k:longint); begin s[k]:=s[l[k]]+s[r[k]]+w[k]; end; procedure rturn(var k:longint); var t:longint; begin t:=l[k];l[k]:=r[t];r[t]:=k;s[t]:=s[k];pushup(k);k:=t; end; procedure lturn(var k:longint); var t:longint; begin t:=r[k];r[k]:=l[t];l[t]:=k;s[t]:=s[k];pushup(k);k:=t; end; procedure ins(var k,num:longint); begin if k=0 then begin inc(tot);k:=tot;v[k]:=num;s[k]:=1;w[k]:=1;l[k]:=0;r[k]:=0; rnd[k]:=random(maxlongint);exit; end; inc(s[k]); if num=v[k] then inc(w[k]) else if num<v[k] then begin ins(l[k],num);if rnd[l[k]]<rnd[k] then rturn(k);end else begin ins(r[k],num);if rnd[r[k]]<rnd[k] then lturn(k);end; end; procedure del(var k,num:longint); begin if v[k]=num then begin if w[k]>1 then begin dec(w[k]);dec(s[k]);exit;end; if l[k]*r[k]=0 then k:=l[k]+r[k] else if rnd[l[k]]<rnd[r[k]] then begin rturn(k);del(k,num);end else begin lturn(k);del(k,num);end; exit; end; dec(s[k]); if num<v[k] then del(l[k],num) else del(r[k],num); end; procedure build(k,x,y:longint); var i:longint; begin with t[k] do begin l:=x;r:=y;mid:=(l+r)>>1; for i:=l to r do ins(rt,a[i]); if l=r then exit; lch:=k<<1;rch:=k<<1+1; build(lch,l,mid);build(rch,mid+1,r); end; end; procedure print(x:longint); begin if x=0 then exit; print(l[x]); write(x,' ',v[x],'!'); print(r[x]); end; procedure change(k,x,y:longint); begin with t[k] do begin del(rt,a[x]);ins(rt,y); if l=r then exit; if x<=mid then change(lch,x,y) else change(rch,x,y); end; end; function rank(k,num:longint):longint; begin if k=0 then exit(0); if num=v[k] then exit(s[l[k]]) else if num<v[k] then exit(rank(l[k],num)) else exit(s[l[k]]+w[k]+rank(r[k],num)); end; function query(k,x,y,num:longint):longint; begin with t[k] do begin if (l=x) and (r=y) then exit(rank(rt,num)); if y<=mid then exit(query(lch,x,y,num)) else if x>mid then exit(query(rch,x,y,num)) else exit(query(lch,x,mid,num)+query(rch,mid+1,y,num)); end; end; procedure solvechange; begin readln(x,y); change(1,x,y); a[x]:=y; end; procedure solveask; var l,r,mid:longint; begin readln(x,y,z); l:=0;r:=1000000000; while l<=r do begin mid:=(l+r)>>1; if query(1,x,y,mid)+1>z then r:=mid-1 else l:=mid+1; end; writeln(r); end; procedure init; begin tot:=0; readln(n,m); for i:=1 to n do read(a[i]);readln; build(1,1,n); end; procedure main; begin for i:=1 to m do begin read(ch); case ch of 'C':solvechange; 'Q':solveask; end; end; end; begin assign(input,'input.txt');assign(output,'output.txt'); reset(input);rewrite(output); init; main; close(input);close(output); end.
View Code
相关文章推荐
- [bzoj1901]: Zju2112 Dynamic Rankings
- BZOJ[1901]Zju2112 Dynamic Rankings 树套树(线段树套Splay)
- BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
- bzoj1901 Zju2112 Dynamic Rankings
- 【bzoj1901】Zju2112 Dynamic Rankings
- BZOJ 1901 Zju 2112 Dynamic Rankings 与更改的树董事长
- BZOJ_P1901 [ZJU2112] Dynamic Rankings(树状数组+主席树)
- 【BZOJ】【P1901】【Zju2112 Dynamic Rankings】【题解】【整体二分】
- BZOJ 1901: Zju2112 Dynamic Rankings
- [bzoj1901][Zju2112]Dynamic Rankings_主席树
- bzoj 1901: Zju2112 Dynamic Rankings
- 【BZOJ 1901】【ZJU 2112】Dynamic Rankings
- Bzoj1901 Zju2112 Dynamic Rankings
- BZOJ 1901: Zju2112 Dynamic Rankings
- BZOJ1901: Zju2112 Dynamic Rankings
- BZOJ 1901: Zju2112 Dynamic Rankings
- 【BZOJ】1901 Zju2112 Dynamic Rankings 树状数组+主席树
- bzoj1901 Zju2112 Dynamic Rankings
- 【分块】bzoj1901 Zju2112 Dynamic Rankings