POJ 2104:K-th Number(主席树静态区间k大)
2024-10-21 12:41:18
题目大意:对于一个序列,每次询问区间[l,r]的第k大树。
分析:
主席树模板题
program kthtree;
type
point=record
l,r,s:longint;
end;
var
t:array[..*]of point;
a,b,id,root:array[..]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 ];
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 ;
if v<=mid then add(l,mid,v,t[p].l) else add(mid+,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 ; 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+,r,k-s));
end;
begin
readln(n,m);
for i:= to n* do t[i].s:=;
for i:= to n do begin read(a[i]); id[i]:=i; end;
qsort(,n);
for i:= to n do b[id[i]]:=i;
len:=;
for i:= to n do
begin
root[i]:=root[i-];
add(,n,b[i],root[i]);
end;
for i:= to m do
begin
readln(x,y,k);
writeln(a[query(root[x-],root[y],,n,k)]);
end;
end.
最新文章
- Ubuntu的多文件编译以及c语言的数组、函数
- [ActionScritp 3.0] 使用LocalConnection建立通信
- Eclipse开发Android程序如何在手机上运行
- 在.net中悄悄执行dos命令,并获取执行的结果(转)
- oracle11g导入dmp文件(根据用户)
- [Ruby01]Class, Module, Object,Kernel的关系
- Linux ps aux指令詳解--转
- Linux实现密钥登陆
- vagrant 入门3
- iconfont.cn阿里巴巴矢量图下载字体图标实战
- appium初学者,使用之检查appium环境报错Could not detect Mac OS X Version from sw_vers output: &#39;10.12.1’,
- Java第七周学习总结
- eclipse工程当中的.classpath 和.project文件什么作用?
- 你不知道的JavaScript--Item20 作用域与作用域链(scope chain)
- Asp.Net Core中HttpClient的使用方式
- k8s中yaml文常见语法
- spring cloud: zuul(五): prefix访问前缀, ignoredServices粗粒度访问, yml不起作用
- 什么是内存溢出以及java中内存泄漏5种情况的总结
- spring 注解 注入属性 和 注解完成bean定义
- eclipse安装hadoop插件