【题解】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\) 一定是关于 \(f_{fa(u)}\) 的一次函数,于是设:\(f_u=k_uf_{fa(u)}+b_u\)。
我们把 \(to(u)\) 上面这个式子算出 \(f_{to(u)}\) 然后再代回第一个式子,求出 \(f_u\):
(我们先假设 \(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\)。
考虑枚举上一次加法的位置转移:
我们注意到,第二维下标有一个连乘形式,而我们第二维限制了最多是 \(m\),所以对于 \(a_i\ge 2\) 的情况,我们是可以 \(O(nm\log m)\) 做的。
(我大概想到这里,然后感觉怪怪的,因为 \(nm\) 还是不太可过,然后就弃了 /kk
接着对于 \(a_i<2\) 的情况,我们做一些 casework。
- \(a_i=0\):我们直接对第二维相同的维护第一维的前缀或和就行了;
- \(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 就行了。