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。

总结:

  • 转移:只考虑一步分类讨论

  • 刻画答案正难则反贡献思想从部分分获得灵感

posted @ 2025-07-16 20:57  _KidA  阅读(6)  评论(0)    收藏  举报