POJ 2104 K-th Number
题意:求区间第k小
思路:主席树模板题
SPOJ COT Count on a tree
题意:树上第k小
思路:节点以父节点为last版本建树,然后推计算树上第k小公式,要用在线求lca算法,推荐树链剖分求lca
HDU 5919 Sequence II
题意:给你n个数的数组,q给询问,每次询问区间l,r中每个数第一次出现的位置的第(k+1)/2大(答案是位置),k为区间l,r中不同数的个数,要求在线;
思路:从后向前建立n颗线段树,如果从后向前那个数第一次出现,pos[a[i]]=i;在i这个位置的值加1
如果从后向前那个数不是第一次出现,先将a[i]最后出现的那个位置pos[a[i]]-1,然后i这个位置+1,pos[a[i]]=i;
1 1 2 2 3 3 -> 最后一颗树的效果 1 0 1 0 1 0;第3课树的效果(在i为4的位置)0 0 0 1 1 0;
求区间l,r不同数的个数,查询第i==l建的那颗数就好了,然后查询i==l的区间第(k+1)/2大位置;
hdu 6621 K-th Closest Distance(二分答案)
题意:给n个数的数组,q次询问,每次询问给一个l,r,p,k,求区间l,r中 |a[i]-p|(l<=i&&i<=r)中第k小
思路:这个题目a[i]不是很大,不用离散化,在主席树中二分答案p-mid,p+mid即可(比赛时被k迷惑了,暴力枚长度为k的区间也卡过去了,但是超时太多了。。。。)
CodeForces 538F A Heap of Heaps
题意:给n个数的数组,求这n个数构成的完全m叉树的儿子节点的权值小于父亲节点(直接相连的才叫父节点)权值的数量;其中1<=m<=n-1,输出n-1个数;
思路:会发现完全m叉树的非叶子节点数量为 n/m; 也就是说叶子节点很多 ,我们要计算有儿子节点的节点,m==1特殊计算,先枚举m(2~n-1, 1)计算左端点 i*j-i+2,右端点 i*j-i+2+i-1(和左端点相差i-1) 其中i表示i叉树,j表示以j为根的子树;用主席树求l,r小于a[j]的数量即可; 主要是要发现完全m叉树的非叶子节点数量为 n/m; 那么复杂度为 n/1+n/2+n/3+..+n/(n-1) 复杂度为n*log(n),(嘻嘻,不会证明,算法竞赛进阶指南上面有说为n*logn);
CodeForces 484E Sign on Fence(动态开点可持久化线段树)
题意:给一个n个数的数组hi,q个询问每个询问给出l,r,w 求区间l,r中,连续的w个数>=x ;x最大值;
思路:当考虑x时,将<x的为0,>=x的为1 最后判断是否可行,线段树区间合并的板子,但是这个题目是二分答案找x,但是每次二分答案的x都要建线段树 考虑到x只会是h[i] 那么就将每个高度建一颗线段树,二分答案x时直接利用即可;那么怎么将每个h[i]建线段树呢,先将h[i]离散化,利用可持久化思想建线段树即可;