CSP 2020模拟赛1题解&&总结

先总结一下自己的得分情况:

在这里插入图片描述
T2想不出来很不应该,把式子写下来,交换两个 ∑ \sum 然后开桶分块就做完了。

Solution

T1

首先,如果 m < n − 1 m<n-1 mn1,那么显然构造不出连通图,输出 − 1 -1 1

否则,我们这么构造这个图: 从 1 1 1 2 2 2,从 2 2 2 3 3 3……从 n − 1 n-1 n1 n n n,先连这 n − 1 n-1 n1条边,然后剩下的边在保证无重边自环的情况下乱连就可以了。

即,我们最终输出的是 1 , 2 , … … n 1,2,……n 1,2,n

时间复杂度 O ( ∑ n ) O(\sum n) O(n)。期望得分 100 100 100分,实际得分 100 100 100分。

T2

首先,我们通过线性筛,筛出 1 − 1 0 6 1-10^6 1106的质数。

然后,答案的式子就是 ∑ i = 1 n ∑ p k ⌊ a i p k ⌋ \sum_{i=1}^n \sum_{p^k} \lfloor \frac {a_i} {p^k} \rfloor i=1npkpkai, p p p为一个质数。

我们交换两个 ∑ \sum ,得到 ∑ p k ∑ i = 1 n ⌊ a i p k ⌋ \sum_{p^k} \sum_{i=1}^n \lfloor \frac {a_i} {p^k} \rfloor pki=1npkai

相当于,我们每次枚举了一个数,要查询所有数除以它向下取整的值之和。我们可以开桶。假设 p k = x p^k=x pk=x,有 t x − ( t + 1 ) x − 1 tx-(t+1)x-1 tx(t+1)x1这些数除以它向下取整的值相等。

所以,我们直接枚举 t t t,然后处理出这一段的那个答案乘上这一段的大小再累加即可。

时间复杂度为调和级别,即 O ( I n m   m + n ) O(In{m}\ m+n) O(Inm m+n),这里 m m m为所有 a i a_i ai的最大值。期望得分 70 70 70分,实际得分 0 0 0分( M L E \color {red} {MLE} MLE)

T3

首先可以一眼看出这是一个 d p dp dp题。状态设计与状态转移也十分显然。

状态设计: d p i , j dp_{i,j} dpi,j表示看到第 i i i个数,目前有 j j j k k k使得 b k > b k + 1 b_k>b_{k+1} bk>bk+1
状态转移: ①之前的那个数比这个数大,即 d p i , j = d p k , j − 1 + 1 ( a k > a i ) dp_{i,j}=dp_{k,j-1}+1(a_k>a_i) dpi,j=dpk,j1+1(akai)
②之前的那个数不大于这个数,即 d p i , j = d p k , j + 1 ( a k ≤ a i ) dp_{i,j}=dp_{k,j}+1(a_k≤a_i) dpi,j=dpk,j+1(akai)

时间复杂度 O ( n 2 m ) O(n^2m) O(n2m),无法通过本题。

可以发现,我们的状态很难再优化,那我们的转移呢?可以发现,这是一个权值线段树的套路。我们可以将 a a a数组离散化,方便权值线段树的维护。

时间复杂度 O ( n k l o g n ) O(nklogn) O(nklogn),可以通过本题。

T4

出题人给的大力分讨是一种不错的解法。这里介绍的是我自己的树剖套线段树的解法。

每次,我们先做这些操作:
①把所有节点的权值设为 0 0 0
②把 x x x y y y这条路径上所有节点的点权设为 1 1 1
③把在 a a a子树中的所有节点的点权设为 0 0 0
④把 b b b子树中所有节点的点权设为 0 0 0
然后,答案就是整棵树中所有节点的权值之和。显然,这四个操作都相当于区间摊,可以用线段树来维护;但是这是在一棵可爱的树上,所以我们得采用树剖套线段树。

时间复杂度 O ( n + q l o g 2 n ) O(n+qlog^2n) O(n+qlog2n)

这里说一下为什么这种做法是正确的。我们的①,相当于清空了之前的操作;经历了②③④操作的洗礼,所有权值为 1 1 1的节点都是满足要求的节点,求和就是这种节点的数量。


黄鹤楼(OI版) [现代]ducati
昔人已乘AC去,此地空余大树剖。
深搜一去不复返,MLE千载空悠悠。
晴川历历线段树,不开 4 4 4倍见祖宗。
日暮蓝勾何处是?爆0挂分使人愁。

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/109266747