标签:
题目大意:对于一个序列,每次询问区间[l,r]的第k大树。
分析:
主席树模板题
program kthtree; type point=record l,r,s:longint; end; var t:array[0..100000*50]of point; a,b,id,root:array[0..100000]of longint; n,i,m,x,y,k,v,len:longint; procedure qsort(l,h:longint); var i,j,t,m:longint; begin i:=l; j:=h; m:=a[(i+j) div 2]; repeat while a[i]<m do inc(i); while m<a[j] do dec(j); if i<=j then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; t:=id[i];id[i]:=id[j]; id[j]:=t; inc(i); dec(j); end; until i>j; if i<h then qsort(i,h); if j>l then qsort(l,j); end; procedure add(l,r,v:longint; var p:longint); var mid:longint; begin inc(len); t[len]:=t[p]; p:=len; inc(t[p].s); if l=r then exit; mid:=(l+r) div 2; if v<=mid then add(l,mid,v,t[p].l) else add(mid+1,r,v,t[p].r); end; function query(x,y,l,r,k:longint):longint; var mid,s:longint; begin if l=r then exit(l); mid:=(l+r) div 2; s:=t[t[y].l].s-t[t[x].l].s; if k<=s then exit(query(t[x].l,t[y].l,l,mid,k)) else exit(query(t[x].r,t[y].r,mid+1,r,k-s)); end; begin readln(n,m); for i:=1 to n*50 do t[i].s:=0; for i:=1 to n do begin read(a[i]); id[i]:=i; end; qsort(1,n); for i:=1 to n do b[id[i]]:=i; len:=0; for i:=1 to n do begin root[i]:=root[i-1]; add(1,n,b[i],root[i]); end; for i:=1 to m do begin readln(x,y,k); writeln(a[query(root[x-1],root[y],1,n,k)]); end; end.
POJ 2104:K-th Number(主席树静态区间k大)
标签:
原文地址:http://www.cnblogs.com/qtyytq/p/5757597.html