【杂题乱写】Codeforces Round#906
只更新 div2 的。
A
判断是不是只出现了两种数字,且出现次数之差不超过 1
B
写一个不太复杂的模拟
C
按照题意从外往里缩着判断就行了。按位
D
假设出现了连边 \((i,j)\) 那么一定可以连边 \((1,i)\) 或者 \((1,j)\) 证明可以考虑反证。
在观察一下发现如果连边 \((1,i)\) 那么所有 \(1<j<i\) 都可以连边 \((1,i)\) 所以直接线性扫一遍就行了。
E
【Easy version】
删掉两个区间,本质上是找到区间里面权值为 \(1\) 的元素数量,如果有交集那么就找到交集里面权值为 \(2\) 的元素数量。
没交集就前缀求一个最大值(区间右端点 \(\le r\) 且区间里面 \(1\) 最多的区间的 \(1\) 的个数)后缀求一个最大值
如果直接枚举有交集的区间比较蠢,因为可能交集里面的元素权值都 \(\ge 3\)。不如找到所有权值为 \(2\) 的元素有哪些,枚举覆盖它的两个区间。这个显然需要扫描线。
现在还漏了一种情况就是有交但是交集中权值为 \(2\) 的元素数量是 \(0\)。那么直接在上面扫描线的过程中搞一下。
【Hard version】
\(k\le 10\) 可以考虑 DP。设 \(f_{i,j}\) 表示前 \(i\) 个元素,已经删掉了 \(j\) 个区间所能获得的最大的 \(0\) 的数量,转移考虑转移考虑枚举 \(>i\) 的某个 \(t\) 并把满足 \(i<l\le t\le r\) 的区间 \([l,r]\) 全部删掉。注意到这样的区间不超过 \(k\) 个那么记录下来区间数量的变化位置,然后取前缀 \(\max\) 就行了。
F
由浅入深,如果每个栈里面有一个元素,那么整体形成一个基环森林。那么把每棵基环树上的环删掉之后,树根就是树上所有节点的答案。
所以我们要做的工作是把环都删掉。然后把森林的点的答案设置为根节点。
栈里元素不是 \(1\) 也没什么不一样,把所有环都吃掉,然后再找树根就行了。注意到求出来某个点的答案,不一定要求某个点的栈全部被弹空,只要栈顶的答案被求出来就行了。
感觉这题还是比较有趣的,大家都可以来玩玩*