CSP-S 考前做题

P11217

唐题,区间修改,线段树上二分即可。

P11218

首先还是博弈论题要么打表找规律要么dp。

然后注意到 \(2 \times n\) 网格这个东西非常典,状态数很少,可以状压。

首先我们做一点观察:不难发现 \(1 1\) 一定全选, \(0 0\) 可以选一个,然后 \(0 1\) 可以选两个然后没贡献,这样他就没法换,跑一遍最大子段和。

然后注意到他换只能换 \(0 1\)

如果你选了一些 \(0 1\), 那他一定会给你定点爆破,把那些 \(0 1\) 换了,你损失 \(2 \times m\)

然后注意到你如果 \(0 1\)\(1\) 的个数很多的话那你可以选,但是 $ < 2 \times m$ 列肯定不优,不妨把 \(2 \times m\) 拿出来,然后你现在就相当于选一个联通块,随便选,然后你要最大化 1 个数 - 0 个数。这个不可能把答案算错,因为如果 01 列不够 2m 的话,你这个方案把所有的列换成双联,答案会变好。

然后注意到 \(2 \times n\) 网格这个东西非常典,状态数很少,可以状压。

然后设 \(f_{i,S}\) 表示 以 \(i\) 结尾状态 \(S\) 就做完了。

code

我自己想的时候到选联通块那一步把问题错误的转化成了最大子段和,然后发现是假的,后来一直在想贪心。建议重新审视问题。

哦还有就是有时候可以放开限制重新描述问题。

P11219

自己做的!虽然是唐题。

首先判掉一些平凡情况,比如区间 max > w1,然后 sum <= w1 && len <= c1 之类的。

那第二个人一定能操作。

考虑 c,w 哪个更重要。

不难发现性质1:第二个人操作只会操作长度 = c2 的区间或者整个区间。

显然如果 c2 > c1 的话,那你一次操作 c2 以后必然可以一直耗着。也就是能操作就赢。

否则 c2 <= c1, 如果 w1 >= w2 那么显然第一个人一次操作没法覆盖所有区间,那第二个人也能赢。

否则就是 c2 <= c1,w1 < w2。

那你发现这个人没法操作的区间都可以被染色,能操作的区间必然要被一次染完,否则第二个人可以一直保持最左最右不被同时染,一定能赢。

就做完了,然后你发现你就是求 \(\sum_{i=l}^{l+c2-1} > w2\) 的在 \([l,r]\) 内的最小 \(i\) 和最大 \(i\),线段树单点维护 \(\sum_{i=l}^{l+c2-1}\) ,查询时线段树上二分即可。

复杂度 \(O(n \log n)\)

code

posted @   xiaohuzai  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示