核桃 CSP-S 模拟
T3
题意:
给定一个 \(01\) 串,选定一个操作序列,每次从原串中删除一个数,保持原串中相对顺序不变,把形成的新字符串加入答案字符串,求出本质不同答案字符串总数。
其中 \(n\le 400\)
思路:
我们不妨把题意转化一下,对于每一个节点赋值 \(t_i\) 表示 \(i\) 位置将于时间 \(t_i\) 被删除,其中 \(t_i\) 互不相同。此时考虑什么样的时间排列会使得最终形成本质相同的方案。容易发现,对于序列中已经存在的一个连续段 \(0\dots 0110\dots 0\) ,其中的两个 \(1\) 的删除时间若交换,能形成的答案字符串本质相同,此时即形成了重复。
所以我们不妨限制一下可能处于同一连续段的两个相邻元素的删除时间,即位于同一个连续段的两个元素我们要保证位于前面的点的删除时间早于后面的点,即若 $ \forall i<j\in [1,n] 且 \forall k\in [i+1,j-1],t_k<t_i,t_i$ ,强制使得 \(t_i<t_j\)。
开始设计 \(dp\) 状态,观察到 \(n\) 较小,在确定一个区间的删除顺序之后,不会对于相邻区间造成影响,考虑区间 \(dp\) ,我们设 \(dp_{i,j}\) 表示已确定了 \(i\sim j\) 的删除顺序,方案数为 \(dp_{i,j}\)。我们可以钦定 \(\forall k\in[i,j]\),都有 \(t_k<t_{i-1},t_{j+1}\) 。因为我们要保证 \(t_i<t_j\),所以我们考虑在区间内部最晚删除的一个元素 \(k\) ,因为我们可以只关心当前元素与前一个相邻元素的大小关系,所以去考虑 \(a_{i-1}\) 和 \(a_k\) 的颜色关系。
-
\(a_{i-1}\ne a_k\) ,此时 \(i-1\) 的删除时间就与 \(k\) 无关,所以不需考虑特殊性,可以直接转移。
-
\(a_{i-1}=a_k\) ,所以我们此时需要钦定 \(t_{i-1}\) 一定小于 \(t_k\) ,但是我们先前钦定了 \(t_{i-1}\) 和 \(t_{j+1}\) 一定晚于 \(t_i\) ,所以无法转移。
T4
题意:
给定一个不一定合法的括号序列,左括号上带有权值,给定 \(q\) 次询问 \(l,r\) ,询问 \(l,r\) 之中能够形成的合法括号序列的最大权值。
其中 \(n\le 2e5,a_i\le 1e9\)
思路:
暴力 \(O(\min(n,q)\times n\log n)\) 做法是简单的,每次把左括号的权值插入 \(set\) 中,遇到右括号时取出最大权值。
考虑优化,在线做法显然不合实际,我们无法快速拆分 \(1\sim l-1\) 和 \(1\sim r\) 的答案。
考虑离线做法,扫描线?同样无法操作,换维无法同时维护 \(q\) 个 \(set\) 。
CDQ?好像有点接近了,我们可以先求出 \(i\sim mid\) 和 \(mid+1\sim j\) 的答案,然后合并两次操作,但是没有必要,因为处理 \(l\sim mid\) 和 \(mid+1\sim r\) 的答案是简单的,我们可以在每一层中 \(n\log n\) 的直接求出。
CDQ的做法貌似很接近的话……猫树?好像可以。像上面所说的,“可以先求出 \(i\sim mid\) 和 \(mid+1\sim j\) 的答案,然后合并两次操作”。但是我们要怎么合并呢?观察性质,可以发现左侧的右括号 对 右侧的左括号无影响,所以左侧已经匹配到的左括号无需撤销。
现在只有右侧的一些右括号与之匹配的元素需要进行修改,若右侧存在一些未进行匹配的右括号,那么这些右括号是可以直接与左侧的一些未匹配的左括号进行匹配的。
现在考虑右侧已经被使用的右括号,设新加入的左括号权值为 \(lval\) ,该右括号原本与其匹配的左括号权值为 \(rval\) ,此时对于答案的影响即为 \(lval-rval\) 。
发现我们现在只关心左侧未进行匹配的左括号和右侧的右括号了!我们用主席树维护这些权值,每次比较右侧右括号的最大撤销单次代价和左侧左括号的最小单次新增答案,我们通过二分可以找到一个右括号反悔的个数最大值。