Atcoder 记录
区的记录。
arc227
这场 arc 寄到家了。感觉也是情理之中,最近 vp cf 的排名一直在下滑,主要是注意力不集中,态度不端正。也算是敲响了警钟了。
-
【F】但是 F 题感觉有点抽象,我感觉有点 f<c,d,e 了。
首先直接将操作更改一下,题目是将 \(a_x,a_y\) 去掉,那么转换为将 \(a_x,a_y\) 的位置加上括号。那么显然每个点的值就是括号层数。于是对于一组 \(b_1,b_2,\cdots,b_m\) 的最终状态,其判定条件不难写成 \(s=\sum_{i=1}^{m+1} |b_i-b_{i-1}|+m\),则 \(s \le n\) 且与 \(n\) 同奇偶。
对于计算 \(\sum_{i=1}^{m+1} |b_i-b_{i-1}|+m=s\) 的序列个数可以令 \(g_{i,j,k}\) 表示填到第 \(i\) 个数,连续段长度为 \(j\),\(s=k\) 的方案数个数,然后 \(i\) 可以直接去掉,\(j\) 的范围是 \(O(\sqrt{n})\),于是复杂度就是 \(O(n\sqrt{n})\)。 -
【E】感觉不错。
首先若 \(a_1,a_2,\cdots,a_m\) 互不相等,则方案数就是 \(2^m\),具体可以考虑最小值。于是对于一组操作序列 \(b_1,b_2,\cdots,b_p\) 考虑将其等价于一个互不相同的操作序列。此时 \(\bmod 2\) 的性质体现出来,发现当 \(b_i=b_j\) 时,可以将其抵消等价于一个 \(2b_i\),于是不断做下去即可得到一个不重的操作序列。
于是就可以对每个 \(x \times 2^i\) 考虑其能到达的 \(01\) 操作序列。发现合并的过程本质上等价于加法,于是转换为可以选择 \(cnt_{x \times 2^p}\) 个 \(2^p\),求能组成多少 \([0,2^l-1]\) 中的数。直接二进制背包即可。因为 \(n/x=O(2^l)\),复杂度 \(O(n \log^2n)\).
agc075
vp过了 B 。但是 B 题 1.25h 调完代码被空间+__int128阴了 \(20min\),导致 \(D\) 题在 \(02:57\) 分写完后写错了 \(2\) 个极小的地方 /ll
-
【B】
首先如何判定 \(a_1,a_2,\cdots,a_n\) 是否合法。发现假定上一次是在 \(p\) 操作,则有一种贪心是每一次尽量早。但是这里显然是错的,因为可能能往后覆盖一点。但是这个 “尽量早” 的想法显然是正确的,于是若往后覆盖,覆盖的右端点一定是 \(a_i\)。
于是就可以 \(poly(n)\) dp。令 \(f_i\) 表示以端点 \(i\) 覆盖的最优值,然后枚举上一段端点 \(j\),中间就是 \(\bmod y=a_j\) 的右端点覆盖,一直覆盖到代价 \(<0\) 或者与 \(i\) 矛盾时为止。发现这里与 \(\bmod y=j\) 有关,想到对 \(y\) 进行分段,于是就维护 \(h_k\) 表示 \(\bmod y=k\) 右端点的最大值。
然后就可以将 \(f,h\) 的转移刻画到数据结构上,由于值域较大,可以直接离散化,复杂度 \(O(n \log n)\)。 -
【D】
首先考虑全局最大值 \(i\),考虑若其贡献为 \(xy+i(x>y)\)。则发现 \(ix+1\) 一定不劣!于是 \(i\) 若在 \(\le n-1\) 的位置则一定为乘法,于是另一个乘法显然是剩下的最大值。所以,枚举 \(\le n-1\) 的前两大 \(i,j\),然后对于 \(a_n\) 的方案数即为 \(\min(m,k-i\times j)\)。对于剩下的数相当于分成 \(3\) 段,总贡献写成 \(\sum_{b+c+d = n-3}p^aq^bl^d\) 这个计算直接不断往下拆就 \(ok\) 了,复杂度 \(O(k\log k \log m)\)。
agc072
-
【B-AGC Language】感觉比 A 简单,大概 40min 就做出来了,但是 \(\infty\) 没设置足够毁了我 1.5h 的青春!!!
显然若只操作交换,则最终的代价为 \(\sum \lceil \frac{1-s_i}2 \rceil\)。那考虑交换 \([l,r]\) 会产生什么影响:令 \(S=s_{l-1}+s_r\),则 \([l,r]\) 的贡献更改为 \(\sum_{i\in [l,r]} \lceil \frac{S_i-s}2 \rceil\),得到 \(a_l,a_r\) 越大越好。所以将 \(l,r\) 不断向两边扩展得到:最优的 \(l,r\) 满足 \(s_l\) 是前缀严格最大值、\(s_r\) 是后缀严格最大值。
由于变化量为 \(1,-1\),所以前后缀严格最大值是形如 \(0,1,\cdots,\)。然后画一下图感受一下,发现若前缀 \(max=i\) 与前缀 \(max=i+1\) 之间没有 \(<0\) 的前缀和,则操作 \(max=i\) 一定不优。所以假定有用的最大值 \(p_1,p_2,\cdots,p_k\),则满足 \(p_i\) 与 \(p_{i+1}\) 之间存在 \(s_p=-1\) 的点,由于变化量为 \(1,-1\),所以至少需要用到 \(p_i+p_{i+1}\) 个位置的值,即 \(2\sum p_i \le n\),所以 \(k\le O(\sqrt{n})\)。于是枚举一下两端复杂度为 \(O(n)\)。
上面是 \(K=1\);对于 \(K>1\) 则上述每个贡献形成一个关于 \(k\) 的一次函数,于是求凸包即可。
-
【C-Human Exercise】这题想快速做出来确实是需要打表,这里分享一种无需打表的方法,但是是看了官解后想到的,与官解不同。
显然这题就是要找规律,于是考虑每一个 \(i+j\) 相等的会有什么性质。首先发现 \(i+j=2\) 形如 \(12\cdots12\);然后 \(i+j=3\) 形如 \(121323\cdots121323\)(这里序列表示列的 id);然后可以发现任意时刻均满足 \(0 \le a_{i+1,j}-a_{i,j+1} \le 1\),其中 \(a_{i,j}\) 未经过次数。但是不知道这个会有什么用,于是就考虑将周期调整为一个等价且合法的操作序列。即对于相邻的操作 \(p_i,p_{i+1}\),若 \(|p_i-p_{i+1}|>1\) 则可以直接交换。惊讶的发现这样就将 \(121323\) 交换成:\(123123\),然后依次发现对于 \(i+j=4\) 的点就可以交换成 \(123412341234\)!且对于 \(p_i\) 的方向,显然与交换后的方向是一致的!回到 \(i+j=3\),所以对于 \(1\) 的移动方式先向下移动 \(3\) 次,然后再向右移动 \(1\) 次依次类推,于是就得到 \((i,j)\) 向下移动 \(i\) 次,再移动 \(j\) 次的结论。
然后对于副对角线下方的点,可以猜测是对称的。于是就做完了。
但是自己思考的时候没有考虑每个 \((i,j)\) 的移动方式,而是考虑已知一行的次数,如何求出下一行,所以就爆了。事实上,我现在也没有看懂官解如何通过 \(a_{i+1,j}-a_{i,j+1} \le 1\) 的性质可以直接证明 \((i,j)\) 向下再向右的移动。如果有看懂的可以教教么 kk
浙公网安备 33010602011771号