GDKOI2021口胡
因为在广东集训,我们都要参加 GDKOI2023 来试手。
听说 GDKOI2021 是三天,每天 并且没有大样例。(p.s. GDKOI2022 未举办)而且评测机似乎还是 g++ 4.8.4。
然后由于是非正式选手,我们会在纪中机房打,用的机子会统一是只有 g++ 4.9.2 的 Windows 神秘机。不过听说评测环境会是 NOI Linux 2.0。
反正是,纪中教练(Update: 由 Alpha 从教练那边讨来的)给了我们 GDKOI2021 三天的题面,然后手上也没有可以自己交的地方(没有 gmoj 帐号,注册也没用),因此打算开始口胡!
题面下载链接。
Day 1
A
给你一张
n 个点m 条边的无向图,你要把点集分成两部分,使得两个点集之间的边的边数达到一半的总边数。数据保证有解。保证无自环,重边按重数计。
考虑对点集增量。
每增加一个点,考虑其和已有的两个点集中谁的边数更少,加入那个点集即可。
复杂度
B
给定长为
n 的序列a_1,a_2,\cdots,a_n ,设f_{l,r}=(r-l+1)\min_{l\le k\le r}a_k\quad(1\le l\le r\le n) ,求出从小到大排名在L 到R 之间的各个f 值。
这个,是不是,可以加进 XJCS,作为单调栈基础练习题啊!@devinwang
写个单调栈,建出笛卡尔树,我们就可以知道对于每个
然后我们考虑二分答案,对每个值
然后我们考虑下一个数怎么求:我们先把相同的
这样就可以在
C
给定一个长度为
n 的字符串s ,q 次询问,回答某个区间[l,r] 内的最长回文子串长度。
神秘串串题,不会 PAM,爬了爬了。
考虑 manacher,我们对前一半区间考虑,相当于求出区间内
这个直接离线用扫描线 + 线段树维护哪边取到
复杂度
D
给出
n,k,A 和k 个数对(s_1,v_1)(s_2,v_2)\dots(s_k,v_k) ,求出所有有n 个叶子的如下二叉树的权值和:
- 整颗树的权值定义为其各节点权值之积。
- 叶节点权值为
1 。- 枝节点均有
2 个儿子,且其权值由其左子树中叶子节点个数决定;即,若节点叶子个数为某个s_i(1\le i\le k) 时,其权值为v_i ;如均不满足,则权值定义为A 。对
10^9+7 取模。
数数题!
假设
先判掉
剩下的情况乍一眼不可做,因为是半在线卷积形式。
但这个做法我们感觉很不靠谱,毕竟常数太大了,而
考虑,设
则
于是设
我们推回了原式?
考虑怎么办。
假设后面的柿子已知,设为
则
后面的这个部分就是对一个非
这个容易列 ODE,做到
然后就可以通过递推,再反过来对
于是总复杂度即为
Day 2
A
初始你有
0 颗星,你将参加若干轮比赛,当你有i 颗星时胜率为p_i ,获胜加1 颗星,落败减1 颗星,0 颗星落败不会减星,问期望几轮变为n 颗星,对998244353 取模。
设
容易发现
稍作转化,即可依次推出形如
使用离线求逆元,复杂度即为
本题亦可以用鞅的停时定理与势函数相关知识解决。
B
给定一张
n 个节点的有向图,每个节点p 向p+1 (如果p\neq n )和a_p 连出一条边,你要支持q 次如下操作:
- 修改某个
a_p 。- 查询一个节点
p 可以到达的编号最小节点。允许离线。
唔,很困难啊!
容易发现
注意到我们每个节点均可以到达一个后缀,然后这个后缀的起始点是单调的。
设
考虑如果不带修改,则预处理的部分,可以从小到大依次考虑编号,把
如果一个位置
于是问题就转化为对
复杂度
C
现在有
26 种左右对称的字符,我们不妨称为\texttt a\sim\texttt z ,每个字符依次有一个抄写时间cost_c 。给你一个长为n 的字符串,你要依次抄写之。由于你很聪明,你发现你可以花
C 的时间把已抄写部分的一个后缀「翻折」到后面的部分,从而避免对那些部分的抄写(注意最后一个字符可以被往后翻折,也可以直接在此处进行翻折,详见原题面)。你要回答至少花多久才可抄完。
容易发现对每个前缀,答案是单调的;证明比较容易。
设
容易发现,我们总是从尽可能早的位置进行翻转(代价都是
manacher 的同时维护一个单调队列,表示由谁翻转来的贡献即可。
复杂度
D
二叉堆可以通过倒序
O(n) 轮下滤操作构建,代码详见原题面。给定一个
1\sim n 的排列a ,q 次查询一段区间[l,r] 如果建出二叉堆,其某个位置x 的权值,或者某个权值x 对应的位置。
先看第一类查询。
当更新到当前点时,其权值为子树中的最大值。
然后每次看父亲与另一个子树最大值,模拟一下变化即可
然后考虑第二类查询。
我们从此值的位置向上考虑,每次模拟一下操作,即可
使用 ST 预处理 RMQ,总复杂度
Update: 假了,正解是
Day 3
A
给定一颗
n 个节点的树,每个点有点权a_i 。假设树上有一对路径
(x,y),(u,v)\quad(x\le y,u\le v) ,设f(x,y,u,v) 为所有同时在两条路径上的点的点权的\operatorname{lcm} ,求出所有f(x,y,u,v) 的乘积,对10^9+7 取模。
反向统计有多少路径对会统计到
即,点减边容斥,钦定某个点 / 相邻被选点对必定会被选择,求方案数;不被选的点表示其下某些点会和别的某些点匹配。
容易
由于一个数这样的因子个数为
如果适当地对比较长的部分直接基排,并 ST 表实现
B
给定
n 个数对(a_i,b_i) ,一个区间[l,r] 的正向贡献为(\sum_{i=l}^ra_i,\sum_{i=l}^rb_i) ,反向贡献为(-\sum_{i=l}^ra_i,-\sum_{i=l}^rb_i) 。如果一个贡献的第二部分
>0 ,则称其优秀。假设有若干贡献对
(A,B) ,你要回答对每个A ,分别有多少贡献对满足B>0 。
不妨分别做前缀和,然后按
直接分治 FFT 减法卷积计算贡献即可;也可以多叉分治。
复杂度
注意答案可能会很大,要双模 NTT 然后 CRT 合并。
Update: 假了,分治下去没有变成更小的问题。正确的做法是分块 FFT。
C
对一个异或生命游戏,初始时有
n 个节点(x_1,y_1)(x_2,y_2)\cdots(x_n,y_n) 存活,之后某一时刻某节点存活当且仅当上一时刻其四周恰有奇数个节点存活。你要回答
L 至R 时刻存活细胞数目之和,对998244353 取模。
先考虑
假设起点
则存在当且仅当
方案数则为
化一下柿子。
于是由 Lucas 定理,存活当且仅当
然后就是数个数。
任取
于是就建立了双射。
直接计数
回到原题。
由于
于是一样拆开
(注意可能带一个
按
然后枚举最小
感觉能数位 dp,但是没推过,咕了。
D
没看。睡觉去了。明天 GDKOI Day 2 RP++。