模拟赛
A:简单题。
B:高维后缀和(SOS dp)板题,可以稍作复习。
//遍历x的所有子集,O(3^N),其中N为log x
for(int i=x;i;i=x&(i-1))
//高维后缀和,注意转移顺序,但本题求max,即使重复计算也无所谓
for(int i=0;i<20;i++)
for(int j=0;j<n;j++)
if(!((i>>j)&1)) chkmx(f[j],f[j^(1<<i)]);
C:注意到,我们先不考虑要怎么选择一次操作的 l,rl,rl,r,我们先考虑要在哪些地方断开。发现如果将某个区间断开,我们可以将这个区间加上一个极大值,使这个区间永远和其他区间不一样。所以不难发现一种策略,即贪心的断开区间,能不断就不断,直到必须要断的时候,最后判断一下首尾两个区间是否有重复,然后除以 222 即可。但这个做法是错误的(我也不太知道为什么),因为其实首尾两个区间如果相同是要多一次操作的,所以我们并不能贪心的选择第一个区间。所以我们考虑枚举第一次断开的位置 lll,使用双指针维护 rrr,使得 1∼l1\sim l1∼l 和 r∼nr\sim nr∼n 中无重复元素。再预处理一个数组,记录 iii 至少要跳(断)多少次才能到 nnn,并记录最后一个跳(断)的位置。然后开始做,我们发现,如果从 l+1l+1l+

最低0.47元/天 解锁文章
382

被折叠的 条评论
为什么被折叠?



