Codeforces Round #808 A~D

A

结论:假设在某个位置q减1了,则后面要全选(被痛击之后失去理智
证明:如果后面某个位置没选,则可以把第一个q-1的位置和其交换一下,中间的至少+1,后面的不一定-1,极限情况也是中间+1后面不变,一定不劣
由于第一个-1取决于q,所以这些位置一开始都是固定的,在这些位置往前扩展不减1的就会得到所有后缀,即答案一定是由 一段后缀+前面所有不减1的 构成
二分后缀长度,暴力判断

B

神必题
暴力显然会挂
但是发现有Σai<=5e5的神奇限制,所以暴力的时候不做ai=0的就可以了,每操作x个数时Σai至少减(x-1),所以时间是O(Σai*log)的
其实这只是随便估的,实际的复杂度低得离谱,详见https://codeforc.es/blog/entry/104930?#comment-932884,跑n=1e5,ai=1e18似乎不成问题

C

先求出mst,dfs时不能走不在mst里的边,分别记作白边和黑边
对于某一条黑边,不妨先假设其他黑边不存在,即在走到它之前都只能走白边,这样没有问题,因为如果走了其他黑边那也会挂,在判其他黑边时会考虑到
(要严谨的话可以先求出做法再证明必要性,咕)
由于dfs能走就走的性质,发现不合法的点就是u-v链上其他的点以及其连出去的子树,图见https://blog.csdn.net/xin_jun/article/details/125827808
实际就是除了以u为根的v子树和以v为根的u子树外的点全部不合法,对每个(u,v)都考虑一下就ok了,覆盖用lca判断+子树标记

D

Chinese Round传统艺能
问题等于给每个点赋一个最晚保留时间,要求合法
发现不合法当且仅当存在某个点,其保留时间为t,且有两个不同子树中都含有至少一个>t的点
换言之,合法的情况就是最多有一个子树里有>t的,其余都是<=t(注意最后一步为U={1},所以点1要比其他的都大)
这样就可以把问题下放到子树里了,设f[i,j]表示以i为根,子树时间<=j的方案,最后二项式反演变为恰好1~j
转移枚举j,枚举根i选的k,再顺序dp每个儿子,选一个放f[son,j]其余放f[son,k],这样对于所有都<=j的会多算(儿子个数-1)次,减掉
这样做是O(n^3)的,由于j是儿子的前缀*儿子的后缀再取前缀和得到的,所以前缀积后缀积再前缀和就可以O(n^2)了

posted @ 2022-08-10 17:19  gmh77  阅读(23)  评论(0编辑  收藏  举报