描述 cjBBteam拥有一个很大的野生动物园.这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子.这些狮子从北到南编号为1,2,3,…,N.每头狮子都有一个觅食能力值Ai,Ai越小觅食能力越强.饲养员cmdButtons决定对狮子进行M次投喂,每次投喂都选择一个区间[I,J],从中选取觅食能力值第K强的狮子进行投喂.值得注意的是,cmdButtons不愿意对某些区域进行过多的投喂,他认为这样有悖公平.因此cmdButtons的投喂区间是互不包含的.你的…
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值线段树),维护的信息是序列中每个数的出现次数,静态查询第K极值,只需要从根做二分,然后向下转左右子树,找到叶子节点即可-(由于线段树的性质,这个查找的复杂度是log级..) 那么动态的第K极值呢.. 需要用上树状数组,这时树状数组维护的其实就是一串主席树了,不过这样处理,会MLE,但是应用可持久化原…
很久没打代码了,不知道为什么,昨天考岭南文化之前突然开始思考起这个问题来,这个问题据说有很多种方法,划分树什么的,不过对于我现在这种水平还是用熟悉的线段树做比较好.这到题今年8月份的时候曾经做过,那个时候是作为对函数式线段树的一个基础题来做的,那个时候不懂,看着别人的代码对拍然后摸索下来,所以到了昨天我就已经彻底忘了,因为代码不是自己写的.昨天想了很久,终于参透了它的精髓. 首先对于给出的a[1]~a[n]这么多个数离散化,然后建立一个线段树,线段树中的结点对应的区间[L,R]表示的是在[L,R…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并,将节点少的树暴力插入到节点大的树上面.对于本题,首先,将输入的权值离散化,为已经给出的边建立函数式线段树.对于合并x,y,将y的父节点设为x,然后重新建立y为根的子树的函数式线段树.对于查询x,y,k,设其LCA为p,p的父节点为q,则x+y-p-q就是整个区间. struct node { in…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3207 题意:给出一个数列,若干询问.每个询问查询[L,R]区间内是否存在某个长度为K的子数列(连续的). 思路:将长度为K的每个子数列哈希成一个值,将查询也哈希成一个值,建立函数式线段树,然后对于查询[L,R],查询个数是否大于0. int n,m,K,a[N];int st[N],ed[N];u64 b[N],bNum;u64 p[N],q[N]; u64 getHash(int L…
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到了不过被代码难度吓到了根本不想写QAQ 这时官方的代码就显现出了c++的STL的强大功能了 离散sort+unique+resize+lower_bound直接秒杀,模拟也是lower_bound+讨论直接秒杀 不得不让我这种一直还在手打二分的情何以堪啊QAQ 比较一下吧 官方3K,一同学(c++)…
这题说的是给了两棵树,各有100000 个节点,然后Q个操作Q<=50000; 每个操作L1 R1 L2 R2.因为对于每棵树都有一个与本棵树其他点与众不同的值, 最后问 在树上从L1到R1这条路径上与第二棵树L2 到 R2 这条路上的点 的权值相等的有多少个 这题挺麻烦的 写的想吐了 首先将第一棵树进行树剖,然后通过树剖可以离散出这颗树的每个点的编号从1,2,3,4...N1,然后将第二棵树进行树剖,按照树剖的值依次插入,以第一棵树离散出的值为叶节点的函数式线段树, 如果第二棵树的值在第一棵树…
题意:给你一个数组a[n],对于数组每次建立一个完全k叉树,对于每个节点,如果父节点的值比这个节点的值大,那么就是一个违规点,统计出1~n-1完全叉树下的违规点的各自的个数. 一个直觉的思想就是暴力,因为完全k叉树当k很大的时候,其实层数是特别小的,所以感觉暴力是可以的.注意到一个完全k叉树下v节点的儿子的公式是: k*(v-1)+2...kv+1,相应的父节点的公式是 (v+k-2)/k.儿子的编号是连续的,如果我们可以对每个节点快速的求出连续编号的节点有多少个数比它小我们就可以快速的更新答案…
[描述] cjBBteam拥有一个很大的野生动物园.这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子.这些狮子从北到南编号为1,2,3,…,N.每头狮子都有一个觅食能力值Ai,Ai越小觅食能力越强.饲养员cmdButtons决定对狮子进行M次投喂,每次投喂都选择一个区间[I,J],从中选取觅食能力值第K强的狮子进行投喂.值得注意的是,cmdButtons不愿意对某些区域进行过多的投喂,他认为这样有悖公平.因此cmdButtons的投喂区间是互不包含的.…
线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<…