UNR7
那些你不要的
注意到操作不改变位置下标的奇偶性,即最终答案必然在初始下标为奇数的数中
同时,每次操作恰可删除其中任意一个,进而答案即这些数的中位数(若偶数个则取较大项)
用nth_element实现即可,时间复杂度为\(O(n)\)
比特迷宫
从大到小枚举\(k\in [0,n]\),并调整(二进制下)恰包含\(k\)个\(1\)的位置:
钦定\(s=a+b\)恰包含\(k+1\)个\(1\),取\(a\)为将\(s\)中若干位变为\(0\),即可翻转对应的恰包含\(k\)个\(1\)的位置
换言之,仅需构造一个\(s\)的集合,使得其可以"覆盖"所有恰包含\(k\)个\(1\)的位置
这可以贪心实现,即每次选择能能额外覆盖最多位置中最小的\(s\),最终\(s\)的总数为\(157884\)
另外,这还会翻转\(s\)自身,这仅需在之前的调整中将其设为\(1\)即可
时间复杂度为\(O(n^{2}2^{n}+3^{n})\)
璀璨宝石
当第\(i\)次购买发展卡时,在\([1,i]\)中恰剩一张卡未选,并需在其与\(i+1\)间决策
考虑暴力DP,定义\(f_{i,j,a,b,c,d,e}\)表示所剩的卡为\(j\)且还需要\(a,b,c,d,e\)个宝石的答案
-
若\(a,b,c,d,e\)中仅存在一项非\(0\),此类状态可直接表示
-
否则,即其中任意非\(0\)两项配对后均严格劣,进而存在一项使得仅包含其与其余项的配对
此时,状态仅取决于该项编号和其余项的数量和
状态数为\(O(Cn^{2}m)\)(其中\(C=5\)),并考虑转移:
-
对于第一类状态,枚举新的宝石编号,转移即形如
\[\forall i\in [l,r],2\mid (i-l),f_{i}=\min(f_{i},s-\lfloor\frac{i}{2}\rfloor) \]可以用单调队列优化
但实际上直接暴力就能过了 -
对于第二类状态,配对方式唯一,可以直接转移
时间复杂度为\(O(C^{2}n^{2}m)\)
火星式选拔
对于前\(k-1\)大的\(b_{i}\),其总能加入且不会作为最小的\(b_{i}\)删除,必然在最终答案中
在最后一个前\(k\)大的\(b_{i}\)加入前,其余\(k-1\)个均在答案中,进而加入后答案恰为这\(k\)个
对于第\(k\)大的\(b_{i}\),在此后找到第一个\(\ge b_{i}\)的\(a_{j}\),即转换为\(k=1\)的子问题,倍增即可
时间复杂度为\(O(n\log n)\)
反重:求熵
钦定\(x_{0}=0\),并将限制转换为\(\forall 0\le i<j\le n,L_{i,j}\le x_{j}-x_{i}\le R_{i,j}\)
当确定\(x_{0},...,x_{n-1}\)后,\(x_{n}\)的范围即\([\max_{0\le i<n}x_{i}+L_{i,n},\min_{0\le j<n}x_{j}+R_{j,n}]\)
枚举取到\(\max,\min\)的\(i,j\)(多个取最小),即要求\(\forall 0\le k<n,\begin{cases}x_{k}+L_{k,n}+[k<i]\le x_{i}+L_{i,n}\le x_{k}+R_{k,n}\\x_{k}+L_{k,n}\le x_{j}+R_{j,n}\le x_{k}+R_{k,n}-[k<j]\end{cases}\)
此时即为\(x_{0},x_{1},...,x_{n-1}\)的子问题,且每组方案对答案的贡献为\(\sum_{x_{n}\in [x_{i}+L_{i,n},x_{j}+R_{j,n}]}1\)
重复此过程,维护答案多项式\(f(x_{0},x_{1},...,x_{n})\),每次即求\(\sum_{x_{n}\in [l,r]}f(x_{0},x_{1},...,x_{n})\)
预处理出\(g_{k}(x)=\sum_{i=1}^{x}i^{k}\),并将\(x_{n}^{k}\)用\(g_{k}(r)-g_{k}(l-1)\)代替即可,时间复杂度为\(O(C(n!)^{2})\)
同时,注意到\(i,j\)间独立,时间复杂度为\(O(Cn!2^{n})\)(其中\(C\)为多项式项数)
鸽子收费站
为了方便,以下认为\(n,q\)同阶,并将所有区间右端点\(+1\)
用set维护每个位置上的极长不可通过区间,则整个过程中共有\(O(n)\)个区间
同时,不妨将这些区间看作在不同的位置上,问题即转化为:
给定\(O(n)\)个区间,初始均未被"激活",每次操作支持:
- 改变一个区间的"激活"状态
- 给定\(k,l,r\),依次对\([l,r]\)内被激活的区间\([x,y)\)执行\(k=\begin{cases}y&x\le k<y\\k&otherwise\end{cases}\)
另外,通过对此进一步离线,即转化为题解中所述的问题
对序列分块,记块大小为\(K=\sqrt{n}\),当单点修改时重构,即需对整块实现快速查询
块内本质不同的值仅\(O(K)\)个,可以预处理出每个值的答案
具体的,顺序枚举被激活的区间,维护当前可能被得到的答案以及对应的初始值(区间)
此时,操作即将\([x,y)\)内的答案均合并到\(y\),可以用bitset实现此过程,单次复杂度为\(O(\frac{K^{2}}{w})\)
查询时,将该数二分到对应的序列的(非严格)前驱,即为该数的答案(特别的,若不变仍为自身)
(对所有数)离散化后再次离线,可以在空间复杂度仍为\(O(n)\)个基础上去掉这个二分的\(\log\)
时间复杂度为\(O(n\sqrt{n}+\frac{n^{2}}{w})\)