【杂题乱写】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 的元素数量。

没交集就前缀求一个最大值(区间右端点 r 且区间里面 1 最多的区间的 1 的个数)后缀求一个最大值

如果直接枚举有交集的区间比较蠢,因为可能交集里面的元素权值都 3。不如找到所有权值为 2 的元素有哪些,枚举覆盖它的两个区间。这个显然需要扫描线。

现在还漏了一种情况就是有交但是交集中权值为 2 的元素数量是 0。那么直接在上面扫描线的过程中搞一下。

【Hard version】

k10 可以考虑 DP。设 fi,j 表示前 i 个元素,已经删掉了 j 个区间所能获得的最大的 0 的数量,转移考虑转移考虑枚举 >i 的某个 t 并把满足 i<ltr 的区间 [l,r] 全部删掉。注意到这样的区间不超过 k 个那么记录下来区间数量的变化位置,然后取前缀 max 就行了。

F

由浅入深,如果每个栈里面有一个元素,那么整体形成一个基环森林。那么把每棵基环树上的环删掉之后,树根就是树上所有节点的答案。

所以我们要做的工作是把环都删掉。然后把森林的点的答案设置为根节点。

栈里元素不是 1 也没什么不一样,把所有环都吃掉,然后再找树根就行了。注意到求出来某个点的答案,不一定要求某个点的栈全部被弹空,只要栈顶的答案被求出来就行了。

感觉这题还是比较有趣的,大家都可以来玩玩*

posted @   没学完四大礼包不改名  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示