Luogu P4137 Rmq Problem / mex】的更多相关文章

题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空白叫做A[i-1].data+1, 开头和最尾也要这么插,意义是如果取不了A[i-1]了,最早能取的是啥数.要把这些空白也离散化然后扔主席树里啊. 主席树维护每个数A[i]出现的最晚位置(tree[i].data),查询时查询root[R]的树中最早的data<L的节点(这意味着该节点的下标离散化前代…
题目链接:https://www.luogu.org/problemnew/show/P4137 求区间内最大没出现过的自然数 在add时要先判断会不会对当前答案产生影响,如果有就去找下一个答案. #include <cstdio> #include <algorithm> #include <iostream> #include <cmath> using namespace std; ; , curR = , n, m, a[maxn], answer…
区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些比较显然的性质:如果加入一个数时,答案只会增加:同样的删除一个数时,答案只会减小 利用好这些性质我们就愉快地上莫队即可不过复杂度很迷,转移的时候只能近似\(O(1)\) CODE #include<cstdio> #include<cctype> #include<cmath&g…
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } namespace tr { #define mid ((l+r)>>1) #define lson t[x].l #define rson t[x].r…
一开始想的是莫队,然后维护几个bitset,然后瞎搞.脑子里想了想实现,发现并不好写. 还是主席树好写.我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标.我们查询的时候要在前\(r\)颗线段树中找到第一个出现的位置下标小于\(l\)的数,在线段树上二分就行了. 这个想法还是非常巧妙的. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include&…
题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\):若不等于\(mex\),没有影响. 取出数的时候,如果这个数出现的次数变为了\(0\),\(mex\)就和这个数取一个\(min\) 代码 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int n, m,…
P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后对值域分块,这样求\(mex\)的复杂度就正确了 一种更优的做法是按值域建可持久化线段树,对每个节点维护当前值域区间的最小出现位置,然后查询的时候就从\(r\)的那棵树一直尽量往左边走就好了 Code: #include <cstdio> #include <cstring> cons…
目录 链接 思路 线段树 莫队 链接 https://www.luogu.org/problemnew/show/P4137 思路 做了好几次,每次都得想一会,再记录一下 可持久化权值线段树 区间出现存最小的下标 然后线段树上二分 如果左边min>L 那就去右边 因为左边都被[L,R]占满了 虽然比卡常的莫队慢好多(700ms和1000ms) 但是理论上快哇 线段树 // luogu-judger-enable-o2 #include <bits/stdc++.h> using name…
https://www.luogu.org/problemnew/show/P4137 只会log^2的带修主席树.. 看了题解,发现有高妙的一个log做法:权值线段树上,设数i对应的值ma[i]为数i首次出现的位置(没有出现就是n+1) 如果把询问按左端点排序,这样就转化为:修改:...:询问:询问[1,r]的答案 修改问题不大 询问[1,r]就转化为查询当前权值线段树上最小的数i,其对应的ma[i]>r:维护一下区间最大值,然后线段树上二分即可 可持久化一下线段树,还可以支持在线 ...好吧…
一个主席树题. 一开始想着直接动态开点硬搞就可以了,每次查询只要作一个类似于前缀和的东西看看区间有没有满,在主席树上二分就可以了. 但是这样是错的,因为一个权值会出现很多次……然后就错了. 所以我们考虑记录每一个权值最后出现的位置,直接开权值下标记录每一个权值最后出现的位置,因为是区间查询,所以可持久化一下,这样答案就是第一次出现位置小于$l$的最小权值,查询方法类似. 考虑到答案只可能是$a_{i} + 1, 0$,所以直接大力把$a_{i}, a_{i} + 1,0$都丢进去离散化. 注意线…