「CF1000」

CF1000A Codehorses T-shirts

显然一个字符串要么可以不变,要么可以变成任意一个长度相同的字符串,所以只需要知道有多少字符串不需要操作就好了,直接暴力枚举就好了,\(n\) 只有 \(100\) 显然是可以随便过的.

提交记录

CF1000B Light It Up

可以通过简单的手膜发现肯定需要将这个开关放在某个开关的上一个或下一个位置是最优的.所以可以维护出以某个位置开头时灯是开 \(/\) 关后面有多少时间灯是开着的.然后枚举放灯的位置后可以 \(\mathcal{O}(1)\) 计算出这个位置放开关后亮灯的时间.

提交记录

CF1000C Covered Points Count

显然可以直接离散化 \(+\) 差分实现,不多说.

提交记录

CF1000D Yet Another Problem On a Subsequence

一个数列是否为好数组(\(\mathcal{Good\ Array}\))仅与这个数列的第一个数(\(a_1\))有关,所以如果要计算以某个数开头的好数组序列可以在开头这个数后面的数中选 \(a_1\) 个数显然是都可以合法的.现在需要求的是好序列,可以枚举开头的数与第一个好数组序列结束的位置(后面部分仍然是一个好序列),可以使用组合数和乘法原理快算计算.

提交记录

CF1000E We Need More Bosses

对于两个点之间的边只有当这条边是割边的时候才是必须走的,所以自然就可以想到缩边双联通分量,缩完后就变成了一颗树,而且对于任意两个点之间必须走的路径就变成了这两个点所属边双在树上的简单路径的长度.所以最大值就是树的直径.

提交记录

CF1000F One Occurrence

显然可以把查询离线,然后按左端点排序,在序列上维护这种数下一次出现的位置,那么如果下一次出现的位置在当前这次查询之后,显然这个数在这个区间中只出现了一次,所以直接离线后枚举查询区间的左端点,将每种数下一次出现的位置放上对应的值然后查询在查询的右端点前最右边的值大于右端点的位置就好了(如果查询出来的位置小于左端点那么就不存在合法的数).

提交记录

CF1000G Two-Paths

显然对于 \(x,y\) 之间的简单路径上的边是只能走一次的,而且对于每个点可以向非这条简单路径上的边走出一颗树.所以可以想到维护 \(f_i,g_i\)(\(f_i\) 表示 \(i\) 这个节点的儿子对 \(i\) 的最大贡献的和,\(g_i\) 表示 \(i\) 这个节点的父亲对 \(i\) 造成最大的贡献),显然 \(f_i=\sum\limits_{u\in son_i}\max\{f_u-2*VAL+val_u,0\}\)(\(VAL_u\) 表示 \(u\)\(u\) 的父亲这条边的边权,\(val_u\) 表示 \(u\) 节点的权值),\(g_i=\max\{g_{fa}+f_{fa}+val_{fa}-2*VAL_{i}-{\color{red}{\max\{f_i-2*VAL_i+val_{i},0\}}},0\}\)(\(fa\) 表示 \(i\) 的父亲),其中红色部分显然是 \(i\)\(fa\) 的贡献,显然只有 \(\operatorname{LCA}(u,v)\) 才可以加上父亲的贡献.再考虑一条链上中间两个点的贡献 \(=f_i+f_{fa}-{\color{red}{\max\{f_i-2*VAL_i+val_{i},0\}}}\)(\(fa\)\(i\) 的父亲节点).所以对于所有非 \(\operatorname{LCA}(u,v)\) 的节点都需要减去红色部分的贡献,并且对于所有的查询这个贡献是不会改变的,所以可以直接预处理再树上差分快速计算,对于这条链上的节点的贡献和边的代价也可以树上差分,然后就做完了(比倍增的做法快了不少).

提交记录

posted @ 2020-10-13 12:49  SxyLimit  阅读(116)  评论(0编辑  收藏  举报