2023.01.17 模拟赛小结

更好的阅读体验戳此进入

赛时思路

T1

LG-P8280 「MCOI-08」Photoelectric Effect

有一棵 n1n105)个点的树以及 k2k5)个颜色,根节点为 1。同时,给定一个颜色合并函数 ab,满足当 1a,bk,有 1abk

请问有多少个方案对所有点染色,使得当点对 u,v 之间没有祖先关系,有:

答案对 109+7 取模。

一个较为显然的 树形DP + 状压DP,复杂度卡的比较满,细节巨多,但是思路较为显然,赛时写了 2h,大样例也过了,然后最后 LemonLime 上 whs 造的数据过了 90pts,但是 Luogu 上几乎全 WA 了,最后找了一下才发现判断叶子节点时 !head[p]->nxt 把根也当成叶子了,也就是如果根只有一个子树那就会寄掉。

然后还有个问题就是 Luogu 上必须把边数开到 2e6,开到 1e6 都不行,这也是一个亟待解决的问题。

当然这里的代码是赛时不太正确的,AC Code 参考下文。

Code

T2

LG-P6157 有趣的游戏

给定 n 个点的树,存在点权 wi,独立询问每次可能为单点修改点权,可能给出两点,A 在树上两点最短路径上选择两个点 x,y 最大化 wxmodwy,后者在树上选择非 x,y 的两点同样最大化上式,对于每次询问求出 A 最大的值,并求出此时 B 最大的值,A 无法选择则输出 -1

写了篇题解,内容就放在下文了,错的点是没有考虑到应该维护前 5 大,只维护了 4,且常数过大,然后赛时被卡到了 20pts

Code

T3

CF1762F Good Pairs

给定一个 n 个数的序列 a 和一个数 k,定义一个 子区间 [l,r] 是好的,当且仅当这个区间内存在一个 子序列 满足:

请求出所有合法的子区间数量。多组数据,1n5×105, 0k105, 1ai105

不会,跳!

T4

CF1774G Segment Covering

给定 n 个区间 [xi,yi],保证所有区间均不同。令 f(l,r) 表示从 n 个区间中选择偶数个区间使得其求并集后恰为 [l,r] 的方案数,令 g(l,r) 表示从 n 个区间中选择奇数个区间使得其求并集后恰为 [l,r] 的方案数。给定 q 组询问 [li,ri],输出 f(li,ri)g(li,ri),对 998244353 取模。

赛时没想出来,确实是一道人类智慧性质题,很有 AGC 的感觉,赛时糊的暴力也挂了。

Code

正解

T1

上文说的差不多了。

Code

T2

提供一种复杂度正确但常数巨大码量较大并不优秀的无脑做法,思路来自于模拟赛赛时口糊的,在 Luogu 上可以通过,但赛时在 LemonLime 测的时候大概是因为常数原因被卡的就剩 20pts

首先我们不难想到 wxmodwy 即为链上次小值。这个不难证明,若我们选择最大值,那么其对较小值取模后一定小于较小值,而若我们选择次大值对最大值取模那么可以直接保留次小值。

然后呢最开始我看这道题没太仔细,以为 B 也是在链上找,于是考虑的是维护次次小和次次次小保留次次次小,当然这个是大错特错的,不仅没有考虑 B 是树上的,还没有考虑 A 不能重复权值但 B 可以。

于是在我发现问题后就尝试优化这个思路,最终的过程大概是这样的:

首先树剖显然,然后线段树上维护区间的不可重复的前 5 大值,以及最多重复一次(即有两个)的前 5 大值。然后对于合并子区间,我们考虑直接维护结构体然后重载 +,实现上用一个 basic_string 存子节点所有值然后排序并各种特判细节做一下即可,不难发现超大的常数就是卡在这里了,这东西某种意义上来讲可以认为其为 O(1) 的,但是实际上个人感觉平均大概有个 10 左右的常数。

然后修改较为简单不再赘述,对于查询直接按照树剖查询并合并,对于不能重复的前 5 大取其第二大作为 A 的答案,不存在则输出 -1。然后我们要再次查询整棵树的结果,在可重复两次的前 5 大中删去 A 的两个答案,此时不难理解为什么维护的是可以重复两次的。然后此时还需要分类讨论,如果结果不够说明只能找到两个相同的数,这样结果为 0,如果最终剩下三个数且前两个为 0,那么说明原来的为 a>b>c=d>e,然后 a,b 被删除,此时如果我们不维护 e 答案将变为 0,这也就是为什么我们要维护前 5 大而不是 4,显然此时答案应为 e。同时因为题里没有说 B 取不了的情况,且不难想到只要 n4 那么 B 一定可以拿,所以姑且可以认为题目保证了 n4

当然这里也浅提一下,如果用 multiset 维护 B 的话就只需要维护最大和次大就可以了,常数小且好写,也不知道我模拟赛的时候为什么没想到,估计是开始读错题之后先入为主了。

Code

T3

显然合法区间的一个合法子序列一定可以转换为递增或递减的,于是令 dp(i) 表示 i 之后不包括 i 的能转移到的点的个数,有 dp(n)=0,有转移 dp(i)=dp(j)+cnt(j,n,ai+1,aj)j 表示满足 ai<ajai+k,j>i 的第一个 jcnt(l,r,d,u) 表示在 ai[d,u]i[l,r] 的数量。式子的意义即 dp(j) 代表了所有 >aj 的,我们只需要在此基础上再加上区间内所有 [ai+1,aj] 的即可不重不漏。

Code

T4

考虑发现,若两区间存在包含关系,即 X 包含 Y,那么若 X 存在,则 Y 的存在与不存在会分别对奇数和偶数贡献 1,则 X 存在的方案总贡献为 0,那么我们可以直接认为 X 不存在。同时发现若存在 l1<l2<l3<r1,那么是可以直接删除 [l3,r3] 的,同上理解。然后最终就剩余多个区间且每个区间最多左右各与一个区间有交。于是考虑对于一次询问找到询问 l 的相邻的两个区间,然后向后跳,每次跳到与其完全无交的最近区间。不难发现跳的过程可以倍增维护,注意处理好亿点细节即可。

Code

UPD

update-2023_01_17 初稿