poj2014 不带修改区间第k大树

主席树 又称函数式线段树,又称可持久化线段树……缺点是内存有点儿大……

 1 type node1=record
2 l,r,sum:longint;
3 end;
4 node2=record
5 x,idx:longint;
6 end;
7 var q,i,j,k,tot,n,m:longint;
8 a:array[0..500000] of node2;
9 rank,root:array[0..500000] of longint;
10 t:array[0..5000000] of node1;
11 procedure qsort(h,l:longint);
12 var i,j,m:longint;
13 temp:node2;
14 begin
15 i:=h;j:=l;m:=a[(i+j)>>1].x;
16 repeat
17 while a[i].x<m do inc(i);
18 while a[j].x>m do dec(j);
19 if i<=j then
20 begin
21 temp:=a[i];a[i]:=a[j];a[j]:=temp;
22 inc(i);dec(j);
23 end;
24 until i>j;
25 if i<l then qsort(i,l);
26 if j>h then qsort(h,j);
27 end;
28 procedure insert(var x:longint;num,l,r:longint);
29 var mid:longint;
30 begin
31 t[tot]:=t[x];
32 x:=tot;
33 inc(tot);
34 inc(t[x].sum);
35 if l=r then exit;
36 mid:=(l+r)>>1;
37 if num<=mid then insert(t[x].l,num,l,mid)
38 else insert(t[x].r,num,mid+1,r);
39 end;
40 function query(i,j,k,l,r:longint):longint;
41 var mid,tmp:longint;
42 begin
43 if l=r then exit(l);
44 tmp:=t[t[j].l].sum-t[t[i].l].sum;
45 mid:=(l+r)>>1;
46 if k<=tmp then exit(query(t[i].l,t[j].l,k,l,mid))
47 else exit(query(t[i].r,t[j].r,k-tmp,mid+1,r));
48 end;
49 procedure main;
50 begin
51 t[0].l:=0;t[0].r:=0;t[0].sum:=0;root[0]:=0;
52 readln(n,m);
53 for i:=1 to n do begin read(a[i].x);a[i].idx:=i;end;
54 qsort(1,n);
55 tot:=1;
56 for i:=1 to n do rank[a[i].idx]:=i;
57 for i:=1 to n do
58 begin
59 root[i]:=root[i-1];
60 insert(root[i],rank[i],1,n);
61 end;
62 for q:=1 to m do
63 begin
64 readln(i,j,k);
65 writeln(a[query(root[i-1],root[j],k,1,n)].x);
66 end;
67 end;
68 begin
69 main;
70 end.

poj2014 不带修改区间第k大树,布布扣,bubuko.com

时间: 2024-11-03 21:19:34

poj2014 不带修改区间第k大树的相关文章

少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写,不会的同学可以看一下这个. 加上修改怎么做呢?我们可以用数学老师成天讲的类比思想: 可以发现,不修改的区间k小问题中,每加入一个原序列中的数,对应的主席树在上一个的基础上进行修改,而查询的时候用右端点主席树减去左端点左边的主席树.这样的操作就像是维护前缀和:每次加入一个元素的时候,sum[i] =

zoj 2112 Dynamic Rankings 带修改区间第K大 动态主席树

pass 首先,个人觉得把这个数据结构理解成树状数组套主席树是十分不严谨的.主席树的本质是可持久化权值线段树与前缀和思想的结合.而动态主席树是可持久化权值线段树与树状数组思想的结合.并非树套树般的泾渭分明的叠加. 其次,大概讲下对动态主席树的理解.我们静态主席树中,第i个版本维护的是[1,i]的权值线段树,我们利用前缀和的思想,通过y的版本-x的版本得到[x,y]的权值线段树,从而剥离出一颗对应区间的权值线段树.我们考虑在这个情况下,如果需要修改第a[i]的值,那么从i,i+1,i+2.....

【树状数组套主席树】带修改区间K大数

P2617 Dynamic Rankings 题目描述给定一个含有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,然后读入一系列的指令,包括询问指令和修改指令. 对于每一个询问指令,你必须输出正确的回答. 输入输出格式输入格

[bzoj3065] 带插入区间第k小值 [重量平衡树套线段树]

题面 传送门 思路 发现强制在线了...... 本来可以树套树解决的问题,现在外层不能使用线段树了,拿什么替代呢? 我们需要一种支持单点插入.下套数据结构.数据结构上传合并复杂度最多单log,不能旋转的数据结构 这不是摆明了用重量平衡树吗? 我选了替罪羊树作为上层结构,下面套了一棵线段树,就做完了 查询的时候把替罪羊树上对应的log个区间提取出来,一起在底层权值线段树上二分即可 详见代码注释 Code #include<iostream> #include<cstdio> #inc

[BZOJ 1146]网络管理Network 树上带修改路径k值

题目意思非常清楚,就是要求树上带修改的路径k大值 如果不带修改的话,我会用树上主席树去搞,以父子关系建树,可以参见 [BZOJ 3123]森林 但是带修改就不会打了QAQ,于是去学了另一种在dfs序上搞的方法(同时感谢呵呵酵母菌的帮助) 其实思想是一样的,就是搞出来节点到根路径的线段树,然后用x+y-lca-fa(lca)去差分出来树上路径的线段树,再去里面查询k值 那么我们怎么得到点到根路径的线段树呢?可以在dfs序上差分啊! dfs序列上的dfnl[x]~dfnr[x]包含的是以x为根节点的

【poj1901-求区间第k大值(带修改)】树状数组套主席树

901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7025  Solved: 2925[Submit][Status][Discuss] 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]

BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树

之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池..尼玛终于过了..附zju2112代码于后. bzoj倒是过了,1A的感觉还是很爽的..可是时间不好看..这就是所谓\(O(nlog^3n)\)的复杂度的可怜之处么? 写挂的地方: insert一定要是传地址指针进去. delete时先把地址指针delete掉,最后把是地址指针指向左儿子or右儿子

[BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值. 这道题的题面其实都提醒怎么做了,维护区间k小值用值域线段树,但要维护一个插入操作,树状数组套主席树也用不了,那么这道题还剩下平衡树可以搞,那就上平衡树吧. 我这里的做法,因为要维护序列的顺序,所以我这里用到替罪羊树套值域线段树:我们在替罪羊树的每个节点都套一颗值域线段树,记录以该节点为根的子树的

bzoj 3065: 带插入区间K小值 替罪羊树 &amp;&amp; AC300

3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Description 从 前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一 下,查询区间k小值.他每次向它的随从伏特提出这样的问题: 从左往右第x个到第y个跳蚤中,a[i]第k小的值是多少. 这可难不倒伏特,