一开始想的是莫队,然后维护几个bitset,然后瞎搞.脑子里想了想实现,发现并不好写. 还是主席树好写.我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标.我们查询的时候要在前\(r\)颗线段树中找到第一个出现的位置下标小于\(l\)的数,在线段树上二分就行了. 这个想法还是非常巧妙的. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include&…
题面: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的节点(这意味着该节点的下标离散化前代…
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…
题目链接: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…
P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后对值域分块,这样求\(mex\)的复杂度就正确了 一种更优的做法是按值域建可持久化线段树,对每个节点维护当前值域区间的最小出现位置,然后查询的时候就从\(r\)的那棵树一直尽量往左边走就好了 Code: #include <cstdio> #include <cstring> cons…
题目 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,…
[Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路\(\mathrm{mod} \ 10^9+7\)的值 分析 显然边权存不下,由于取模会影响大小关系,不能直接取模然后跑dijkstra 考虑用可持久化线段树维护每个点到起点的距离(二进制表示),即维护一个01序列,[1,n]从低位到高位存储. 修改的时候我们要把第i位+1,如果第i位是0,直接取反就可以…
描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头是一个字符,若该字符为'A',则表示一个加数操作,接下来一个整数x,表示在数列后加一个整数x:若该字符为'Q',则表示一个询问操作,接下来一个整数x,表示求x位置的值:若该字符为'U',则表示一个撤销操作,接下来一个整数x,表示撤销掉最后进行的若干次操作. 输出 对每一个询问操作单独输出一行,表示答…
题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于每个点 i 就要连边 (S, i, B[i]) 和 (i, T, W[i]). 这样,如果一个点属于 S 集,就要割掉与 T 相连的边,就相当于失去了染成白色的收益. 我们再来考虑 “奇怪的点”,一个点 i 变成奇怪的点的条件是:i 是黑色且存在一个白色点 j 满足 j < i && L…