【题解】Solution Set - Codeforces Div.2 板刷

【题解】Solution Set - Codeforces Div.2 板刷

始于:2024/10/27

因为之前的 「蓝」题板刷 荒了,原因主要是每次想起来刷题的时候,找半天没找到,然后就放弃了。

为了解决这个问题,干脆开始板刷 Codeforces 了 /kk

下面题目大致都是来自 Codeforces Div.2,难度在 *2000 \(\sim\) *2500 之间。


CF2027 Round 982 (Div. 2)

A

观察样例发现,其实等价于去找到一个周长最小的矩形包括了这 \(n\) 个矩形。

故答案为 \((\max h_i+\max w_i)\times 2\)

5min

B

我们最后一步斯大林排序的操作一定会删的只剩一个元素。

并且这一步选择全部一定是合法的。进而整个斯大林排序的过程等价于对整个数组做一次。

注意到第一个元素在斯特林排序中是一定不会被删除的,那么其实整个问题的目标子序列等价于:第一个元素为最大值。

从后往前枚举即可。

11min

(md 突然反应过来 \(n\le 2000\) 可以不用上 bit 的。

C

首先注意到添加的 \(0\) 一定不能再扩展了,她们的作用就是为了增加 \(|a|\)

现在问题转化为:每次操作可以让 \(|a|\gets |a|+i-1\),前提是 \(|a|=a_i-1+i\)

首先按 \(a_i-1+i\) 从小到大排序,按照这样的操作顺序一定是不劣的。

直接从前往后,那个 map 维护可以的长度就行了。

11min

D

玛德,想了快十分钟才看到 \(n\cdot m\le 3\times 10^5\)

直接想 dp 啊。

\(f_{i,j}\):消除掉 \(1\sim i\)\(a_i\),当前 \(k=j\) 的最小花销。

转移是 naive 的,详细见提交记录吧:https://codeforces.com/contest/2027/submission/288289729


CF2030 Round 979 (Div. 2)

B

\(c\)\(t\)\(0\) 的个数。

\(f(t)=2^c-1,g(t)=2^n-2^c\)

E

md,看清楚题!!!我们可以把序列分成 \(k\) 个集合,而不是连续段!!!

这下就简单多了,给定 \(b\) 则其分数为 \(\sum_{i=1}^{n}\min_{j=1}^i c_j\),其中 \(c_i\) 为元素 \(i\) 的出现次数。

暴力 \(O(n^2)\) 转移见:https://codeforces.com/contest/2030/submission/290229230

前缀和优化一下就行了。

(还是做太慢了,思路很清晰但是这类题做得太少了!!!

F

一个区间合法,当且仅当,不存在两个颜色在序列中出现位置没有交错。

注意到,对于一个固定的左端点,合法的右端点一定是单调的。

考虑从右往左遍历左端点,注意到,右端点只能向左移动。

由于我们现在只加了一个元素进来,只用判断她后面第一个相同的颜色 \(j\),是否在某两个相同颜色中间,这个用 bit 维护,每次区间减,直到 \(j\)\(0\)

从左往右扫应该是类似的,不过把减换成加而已。

(有些时候从左往右遍历左端点可能更好做,毕竟左右端点做的事情不一样,可能又一边减不好做,但加很好做。


CF2028 Round 986 (Div. 2)

E

神秘妙妙猜猜题。

显然有:如果是 Alice 走,一定是一直往根节点走;如果是 the Queen of Hearts,一定会往离得最近的走。

\(to(u)\)\(u\) 的儿子,并且在 \(u\) 到离其最近的叶子的路径上。

\(f_u\) 为初始在 \(u\) 的答案。

那么根据上面的结论有:

\[f_u=\frac 12(f_{fa(u)}+f_{to(u)})\\ f_{rt}=1,f_{leaf}=0 \]

我们大胆猜测,\(f_u\) 一定是关于 \(f_{fa(u)}\) 的一次函数,于是设:\(f_u=k_uf_{fa(u)}+b_u\)

我们把 \(to(u)\) 上面这个式子算出 \(f_{to(u)}\) 然后再代回第一个式子,求出 \(f_u\)

\[f_{to(u)}=k_{to(u)}f_{u}+b_{to(u)}\\ f_{fa(u)}=\dfrac{f_u-b_u}{k_u}\\ f_{u}=\frac 12\left(\dfrac{f_u-b_u}{k_u}+k_{to(u)}f_{u}+b_{to(u)}\right)\\ \implies \left(\dfrac 1{k_u}+k_{to(u)}-2\right)f_u+b_{to(u)}-\dfrac{b_u}{k_u}=0 \]

(我们先假设 \(k_u\ne0\)​。

因为 \(f_{leaf}=0\),那么 \(\dfrac 1{k_u}+k_{to(u)}-2=0,b_{to(u)}-\dfrac{b_u}{k_u}=0\)

这样,我们就拿到了 \(u,to(u)\) 的系数的递推关系。

然后,我们认为:\(k_{leaf}=b_{leaf}=0\)。这样就做完了。

F

神秘妙妙 dp 优化题。

首先,我们可以拿到一个很 naive 的 \(O(n^2m)\) dp。设 \(f_{i,j}\):前 \(i\) 个元素是否能算出 \(j\)

考虑枚举上一次加法的位置转移:

\[f_{i,j}=\bigvee_{k=0}^{i-1}f_{k,j-\prod_{p=k+1}^ia_p} \\ f_{0,0}=1 \]

我们注意到,第二维下标有一个连乘形式,而我们第二维限制了最多是 \(m\),所以对于 \(a_i\ge 2\) 的情况,我们是可以 \(O(nm\log m)\) 做的。

(我大概想到这里,然后感觉怪怪的,因为 \(nm\) 还是不太可过,然后就弃了 /kk

接着对于 \(a_i<2\) 的情况,我们做一些 casework。

  1. \(a_i=0\):我们直接对第二维相同的维护第一维的前缀或和就行了;
  2. \(a_i=1\):我们直接对连续的一段 \(1\) 合并处理,这样 \(1\) 被处理的次数与 \(\log m\) 同阶,第二维不变,把上面维护的前缀或和改为前缀和就行了。

现在的时间复杂度 \(O\left(\dfrac {nm\log m}w\right)\),但是空间复杂度 \(O\left(\dfrac {nm}{w}\right)\) 是不被接受的。

由于我们每次转移涉及到的 bitset 最多也只有 \(\log m\) 个,所以我们只用存在当前最后的 \(\log m\) bitset 就行了。

posted @ 2024-10-27 19:29  CloudWings  阅读(16)  评论(0编辑  收藏  举报