外观
GZOI 2025 两日游 · 其一
写在前面
没有报高联,以为轻松了,但是 GZOI 是什么意思?
广州市中学生数学与科学联赛(信息学)怎么不算一种高联呢(笑)
主办方还挺好的,不仅有饭票,还送了水果和面包。
以及,今天忘记带笔了(这在其他的竞赛里面显然是不会忘的),结果没法打草稿,找监考老师借了一支。(明天不会了)
但是必须吐槽的是系统很烂,是旧版的 win7,复制粘贴很难受,专武 Dev C++ 还歪了,fc 还去不了尾随空格(我记得去年 NOIP 可以去)。
T1
注
有一个序列 {ai} 以及 0-1 序列 {ti},求 x∈[−109,109]∩Z 时,序列 {ai+xti} 前缀最小值个数的出现次数。
首先我们知道对 ti=0,1 的项分别取前缀最小值,显然不会改变答案。
发挥一下 Olympaid in Imagination 的想象力,可以想象出两个点集上下平移,相互穿过的场景。
想象出这一个动态过程之后,可以顺理成章的对答案做一次差分,即考虑答案随 x 移动时的变化。
因为我们之前求过前缀最小值,答案出现变化当且仅当一个值穿越到了在它下标之前的前缀最小值(注意只有 ti 不同的才能互相穿越),把不超过 n 次穿越(每个点最多一次)全部找出来,就可以得到差分。
然后通过特殊值把答案重建出来即可。
另外,不开 long long 见祖宗。(虽然我不知道为什么会见)
T2
题意
给定一个长度为 n 的序列 {ai},求子序列求和中出现次数不小于 k 的和。
n≤200,ai≤104,k≤7,时间限制 0.5s。
在 set 上打了个 DP。
后知后觉地发现自己的解法没有把超过 k 的值变成 k,溢出了。结果喜提 WA 0。
T2 正解
注意已经超过 k 的就没必要再更新了。由于我们需要处理“不为 0 的位置 +ai”和“不超过 k 的位置”的交集,需要使用 bitset。
此时由于每次转移都不为 0,DP 值必定增加,于是一个和最多被访问 k 次。时间复杂度 O(wn∑a+k∑a),能过。
T3
题意
给定一棵树,点有点权。有三种操作:
- 修改点权
- 把一条路径上的点编号及其权值反转
- 对于一条有向路径上的点权序列 a1,a2,...,ak,
求 (((a1op1a2)op2a3)...)opk−1ak, opi∈{+,×} 的最大值。
先看看序列上操作 2 怎么做。对于 aopb 来说,只有 a=1∨b=1 时才使用 +,否则使用 ×。
考虑两端还是太复杂了。不难发现 op∈{+,×}maxaopb 一定大于 1,因此单独把前两项拆出来。
之后采用哪种符号只跟 b 有关,可以把点权抽象成线性函数
{fi(x)=x+1,fi(x)=aix,ai=1otherwise
函数的复合满足结合律,使用线段树维护。在树上再加一个树链剖分,即可过没有操作 1 的子任务。
有区间翻转,这种东西一般是用平衡树的,但是我不会。
然后线段树还调了俩小时,还是写挂了。这就是整天写注意力神题,不练板子的代价。
T4
题意
求一个序列中至少包含一个最长上升子序列的子序列个数。保证数据随机。
神秘随机,逆天题目,大病期望。
我不会。正解用了期望来算复杂度,但是连讲题的也没写证明。