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})\)

posted @ 2023-07-21 14:58  PYWBKTDA  阅读(356)  评论(1编辑  收藏  举报