7月15日模拟赛总结
here.
T1 70 分是容易的(虽然我没拿到哈哈哈我是joker),考虑满分做法。
考虑贡献的思想,一个数的变化,只会对它及它后面的数造成影响。具体的,\(\forall i \in [2,n]\),要么 \(+(i \times a)\),要么 \(-(i \times b)\)。
第一个数很特殊,它会对所有 \(n\) 个数造成影响,这表明我的总和只要在模 \(n\) 意义下和 \(s\) 同余,就一定能够通过调整第一个数使得当前的总和变为 \(s\)。
这样转化了题意之后,我们考虑从后往前转移,其他的和 70 分做法是相同的。
T2 令 \(dp_i\) 表示以 \(i\) 结尾的最长括号序列。初始全 0。答案就是 \(\max\{dp_i\}\) 所对应的那段括号序列。转移 \(dp_i=dp_{i-1}+2+dp_{i-dp_{i-1}-2}\),相当于在 \(dp_{i-1}\) 的基础上再加了一层括号,并拼上了前面一截括号序列,显然这样一定是最长的。十分自然的解法。
T3 考虑暴力,实际上就是枚举区间然后 check。现在显然是优化这个 check 的过程,于是自然地定义 \(dp_{i,j}\) 表示区间 \([i,j]\) 是否符合要求。转移考虑两种情形,\(dp_{i,j}\) 考虑从 \(dp_{i+1,j-1}\) 转移而来,或者自己转移到自己,具体见代码。
T4 首先考虑转化括号序列,( 为 1,) 为 -1。
然后考虑刻画答案。什么样的括号序列是合法的?
-
\(\forall i \in [1,n],s_i \ge 0\)。
-
\(s_n=0\)。
我们先考虑满足第一个条件。
令 \(dp_{i,j}\) 表示前 \(i\) 个数,总和为 \(j\) 的方案数。
初始 \(dp_{0,0}=1\),答案 \(dp_{n,\min\{i\}}\),其中 \(dp_{n,i} \neq 0\)。
转移依旧分类讨论:
-
遇到左括号:\(dp_{i,j}=dp_{i-1,j-1}\)。
-
遇到右括号:
-
\(dp_{i,j}=dp_{i-1,j+1}\)。
-
添左括号:\(dp_{i,j}=dp_{i,j-1}\)。
-
不添:\(dp_{i,j}=dp_{i-1,j}\)。
-
之所以在遇到右括号时才添左括号,是因为在哪里添都是一样的。
这样可以通过添加左括号来满足第一个条件。
接着,要想达到第二个条件,就必须添加右括号。
考虑使用与左括号类似的方法解决。这时仅需将左右括号互换,并倒转字符串再做一遍上述 dp 即可通过添加最少的右括号达成条件 2。本题得以解决。
成绩:0+40+0+0=40,rk3。
总结:
-
转移:只考虑一步、分类讨论。
-
刻画答案、正难则反、贡献思想、从部分分获得灵感。

浙公网安备 33010602011771号