[置顶] hdu4747 Mex 线段树】的更多相关文章

题意:给你一个序列,让你求出对于所有区间<i, j>的mex和,mex表示该区间没有出现过的最小的整数. 思路:从时限和点数就可以看出是线段树,并且我们可以枚举左端点i, 然后求出所有左端点为i的区间内mex值的和. 先把数插满,然后先询问后删除当前最左边的断点i.而且显然线段树里面保存的是mex值,而且这个序列是非递减的. 分析:我们先预处理出对于右端点为i的所有<1,i>的mex,分别插入线段树的i位置.然后每次删除最左边的左端点i ,假如当前我们要删除a[i] ,我们找到它之…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:求一个数列中,所有mex(L,R)的和. 注意到mex是单调不降的,那么首先预处理出mex(1,j)的值,复杂度O(n),因为mex最大为n.同时预处理出每个数a[i]的右边第一次出现a[i]的位置,用next[i]表示.然后依次从1开始枚举起点 i,则就是求 i 到n的所有mex的和了.i从i+1变化,j>next[i]的mex值都不会变化,因为还是存在a[i].那么只要考虑i+1到n…
http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我们给出一个长度为n的序列,求他所有的连续的子序列的mex(l,r)的和. 思路: 首先因为n的最大值就是2*10^5 所有我们字需要考虑200000之内的数就好了,然后O(2*n)可以求出(1,1),(1,2), (1,3),(1,4) ... (1,n)来 mex是不减的. 然后我们考虑将第一个数…
题目链接 题意:多次求区间\(mex\). 考虑\([1,i]\)的\(mex[i]\),显然是单调的 而对于\([l,r]\)与\([l+1,r]\),如果\(nxt[a[l]]>r\),那么\([l+1,r]\)中所有\(>a[l]\)的数显然要改成\(a[l]\) 把询问按左端点排序:离散化,预处理下\(nxt[]\),处理出\([1,i]\)的\(mex[i]\).剩下就是线段树的区间更新.单点查询了 /* 离散化的时候>=n的全部看做n就好了 查询时是只需查r点的(l之前能更新…
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l,r. Output 一行一个数,表示每个询问的答案. Sample Input 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 Sample Output 1 2 3 0 3 HINT 数据规模和约定 对于100%的数据: 1<=n,m<=200000 0<=ai&l…
题意:给出长度为n的序列,问任两个区间的mex运算结果的总和. 解法:直接讲线段树做法:我们注意到mex(1,1),mex(1,2),mex(1,3)...mex(1,i)的结果是单调不减的,那么我们考虑先用线段树维护上诉结果,那么此时以1为左端点的区间mex和就求出来了,重点来了:我们考虑怎么从以1为左端点的区间结果过渡到以2为结点的区间结果呢?我们注意到其实只要以1为端点的区间去掉a[1]这个点的影响就可以得到以2为端点的区间结果,那么我们怎样去除a[1]这个点的影响呢?我们发现去掉a[1]…
洛谷 Codeforces 思路 很容易发现答案满足单调性,可以二分答案. 接下来询问就转换成判断前缀点集是否能组成一条链. 我最初的想法:找到点集的直径,判断直径是否覆盖了所有点,需要用到树套树,复杂度\(O(n\log^3n)\),应该过不了. 有一个性质:两条链可以合并,当且仅当能从四个端点中找到两个作为新端点,另外两个在新的链上. 还有一个性质:点\(x\)在\((u,v)\)这条链上,当且仅当\((lca(x,u)=x||lca(x,v)=x)\&\&lca(x,y)=y\),其…
Description 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l,r. Output 一行一个数,表示每个询问的答案. Sample Input 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 Sample Output 1 2 3 0 3 HINT 数据规模和约定 对于100%的数据: 1<=n,m<=200000 0<=ai<…
题面 CF1083C Max Mex 题解 首先我们考虑,如果一个数x是某条路径上的mex,那么这个数要满足什么条件? 1 ~ x - 1的数都必须出现过. x必须没出现过. 现在我们要最大化x,那么也就意味着我们要找到一条路径使得这个都出现过的前缀尽可能长. 第二个条件可以忽略,因为如果第1个条件满足,而第2个条件却不满足,意味着我们可以把x至少扩大1位,因为要求最大值,所以扩大肯定最优,因此我们肯定会扩大到不能扩大为止. 由此我们可以发现,x是满足可二分性的. 考虑在线段树上维护这个问题,区…
题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转. 思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组的值变为1---n(表示第几大). 在建伸展树的时候我们可以顺便用pos[i]记录第i大的数的节点标号. 对于第i次操作,我们用col[]数组记录翻转标记,每次先把第i大的节点pos[i]旋转到根,那么它的位置为i+左儿子的个数.然后左儿子打上翻转标记,最后删除根. 注意:下放懒惰标记时只要交换左右…