码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2104:K-th Number(主席树静态区间k大)

时间:2016-08-10 17:37:37      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:对于一个序列,每次询问区间[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.
View Code

 

POJ 2104:K-th Number(主席树静态区间k大)

标签:

原文地址:http://www.cnblogs.com/qtyytq/p/5757597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!