SDSC2026
虽然我也不知道有什么能记的。
为啥 SDSC 安排在 noi 后两天,这下真没人来了。
\(\text{day0}\)
早上起来赶车,车上打农,下车前往山外,到宿舍继续打农,去吃了个饭,配了下电脑,回来继续打农。
\(\text{day1}\)
100 + 10 + 100 + 0 =210
牢完了,T2 怎么是计算几何,我忘了怎么求凸包啊,T3 怎么是巨大大份题,T4 到底在说啥,严肃 downvote yixiuge777()
T1
给定序列 \(a\),要求重排 \(a\),使得 \(\sum \gcd(a_1,a_2,\dots,a_i)\) 最小。
\(1 \le n \le 10^5,1\le a_i \le 10^9\)。
为啥在 25 年年初做过,call call back 环节吗。
考虑实际有用的只有 \(O(\log V)\) 个数,暴力找到最小的 \(O(\log V)\) 个即可,复杂度 \(O(n\log V)\)。
T2
平面上 \(n\) 个点,每个点有权值,求删掉 \(k\) 个点恰好构成凸包的最大价值。
\(1 \le n \le 10^4,1\le k \le 10\)。
不会求凸包输掉了,想了半天怎么一遍把凸包搞出来。
考虑按照极角排序,然后将两点之间的线段视作向量,显然相邻后一个向量需要在上一个向量的左边即可合法,因为我们就只需要开头的点就可以一遍算出凸包。
然后就简单了,考虑设 \(f_{i,j,k}\) 表示当前加到 \(i\) 点,上一个的点是 \(j\),删了 \(k\) 个点,直接 dp 可以做到 \(O(n^2k^2)\),发现第二维的距离不会超过 \(k\),因此复杂度 \(O(nk^4)\),可以通过。
T3
给定一棵树,支持以下操作:
- 给定 \(x,y\),让 \(x\) 子树每个点 \(z\) 加上 \(\operatorname{dis}(z,y)\)。
- 查询 \(x\) 子树和。
做了半场,读错了一万次。
T4
给定一张带权有向图,记一张最短路 DAG 中的一条边 \((u,v,w)\) 必须满足 \(dis(u,n) = dis(v,n) + w\),记最短路 DAG 中每个点选择一条出边为"最短预设",求最多可以有多少边不按照"最短预设"任意走,且不会走到无法到达 \(n\) 的点,求出这个最大值,最大值为 \(+\infty\) 的话输出 \(n\)。
\(1 \le n,m \le 10^5\)。
yixiuge777 说这是好题。
注意到题意等价于求点在最短路 DAG 中最多随机游走几步可以不走到非法点。
记点的“标号”为其答案,那么所有 \(1\) 不可达的点标号为 \(-1\),\(n\) 的标号为 \(+\infty\),那么不存在标号为 \(-1\) 的点答案无限大,\(1\) 初始不可达答案为 \(-1\)。
考虑反推,观察 \(0\) 号点的形态,显然直接与 \(-1\) 相连的是 \(0\) 号点,进一步地,如果一个点在最短路 DAG 上所有子节点都是 \(0\) 号点,那么他只能是 \(0\) 号点。因此,我们能发现,\(0\) 号点的充要条件是所有最短路径上至少有一个点直接指向 \(-1\) 号点。
推广这个事情,发现可以从 \(k\) 号点推广到 \(k+1\) 号点,具体地,我们分为两个步骤:
- 原图上直接指向 \(k\) 号点的是 \(k+1\) 号点。
- 最短路 DAG 上所有子节点都是 \(k+1\) 号点的是 \(k+1\) 号点。
能够发现这样是正确的,因为每次是从小编号推到大编号,随机游走走到的最坏情况肯定是最短路 DAG 上标号最小的子节点 \(+1\),如果所有子节点都是 \(k\) 那就不需要随机游走强行走到最小点了,标号自然为 \(k\)。
因此,我们只需要建出最短路 DAG,然后在反图按照上述步骤跑出所有点标号即可,最后如果 \(1\) 点未达那答案就是 \(+\infty\)。
复杂度 \(O((n+m)\log m)\)。
qoj17660.Telepathy
给定值域在 \([1,n]\) 内的 \(k\) 个数,\(k < \frac{n}{2}\),\(A\) 需要新加一个不同于这些的数,然后给 \(B\),\(B\) 需要解码出新加的数是谁。
脑电波。
考虑扔到值域上,有的视作 \((\),没有的视作 \()\),做括号匹配,显然最后会剩下 )))(((( 形式,取最后一个 \()\) 变成 \((\) 即可,正确性显然。
另一种做法是反过来,删掉排名为 \(sum \bmod k\) 的数,因为此时 \(k > \frac{n}{2}\),所以有正确性,怎么证的忘了。
\(\text{day2}\)
100 + 100 + 0 + 0 = 200
为啥我做了 3h T1,为啥一场比赛会让选手一半时间都在随机游走。
找规律找规律找规律,发现完全没有好的办法,尝试直接推式子,推了半天,大概三个小时的时候我终于明白了,然后发现 T2 是套路题,但是没什么时间了糊了个 beats 上去直接乱写,幸好在结束前写完了。
T1
给定 \([l,r]\),求出区间内任意多个数加和有多少个本质不同的数。
\(1 \le l \le r \le 10^9\)。
推式子,考虑维护值域上空的个数,这是个二次函数,找一下分界点即可。
T2
给定序列 \(a\),维护三元组 \((i,j,k)\) 的数量,要求集合 \([i,j]\) 和 \((j,k]\) 相同。
\(1 \le n \le 2\times 10^5\)。
显然是 ds 题,考虑把 \(i\) 的方案扔到 \(j\) 上,然后对 \(k\) 扫描线,维护每个位置都当做 \(j\) 的方案。
把条件拆一下,即 \(S_1 \subseteq S_2\) 和 \(S_2 \subseteq S_1\),分别讨论一下,即要求 \((j,k]\) 中每种数最小的上一次出现都在 \([i,j]\) 中,\([i,j]\) 中不出现下一个在 \((k,n]\) 中的数。
发现这两个条件分别对 \(i\) 有上界和下界的限制,分别维护这两个即可,对于上界,显然每次向右拓展会使上界缩小,做一下区间 \(\text{chkmn}\) 即可,对于下界,我们直接维护每个数最后一次的出现位置,然后每次删掉当前新加的数的上一次出现位置,这显然会让下界变松,做 \(\text{chkmn}\) 即可,因此我们可以用 beats 维护,复杂度 \(O(n\log^2 n)\)。
这些区间 \(\text{chkmn}\) 都是重叠的,可以直接单调栈拆开,复杂度 \(O(n\log n)\)。
T3
给定一个环,每个点有初始点权 \(a_i\),点权可以沿环传递,要求每个点最后都在 \([l_i,r_i]\) 中,求最小传递次数。
\(1 \le n \le 2\times 10^5\)。
slope trick 初学者,会尽量把凸优化的细节部分写的详细点。
考虑序列问题,设 \(f_{i,x}\) 表示第 \(i\) 个人向后传递了 \(x\) 个硬币的最小传递次数,因为可能向前向后传,\(x\) 的取值可正可负,每次转移加上 \(|x|\) 即可,具体地,有转移:
暴力转移做到 \(O(nV)\),但是注意到转移是区间取 \(\min\),加绝对值,因为绝对值函数是凸的,所以 \(f_i\) 也是凸的,考虑 slope trick 优化。
我们需要支持的操作有:
-
区间取 \(\min\)。
-
整体加绝对值函数。
因为 \(f_i\) 是下凸的,可以分类讨论一下区间取 \(\min\),在最小值左侧的区域最小值一定取在区间右端点,所以相当于函数向左平移。最小值右侧区域同理,最小值一定取在区间左端点,函数整体左移。
由于 slope trick 维护的是拐点,每个拐点代表斜率变化 \(1\),因此绝对值函数相当于在 \(x=0\) 位置加入两个新拐点。如果最小值平台的 \(x>0\),那么一定会有一段斜率为 \(-1\) 的斜线被变成新的平台,反之同理。因此我们只需要用堆分别维护最小值平台两侧的折线,每次支持插入 \(0\) 点,弹出最小值变成新的最小值平台即可,复杂度 \(O(n\log V)\)。
然后变成环上问题就需要多考虑 \(n \to 1\) 的变化量,考虑直接枚举,复杂度 \(O(nV\log V)\),打个表出来能发现这是有凸性的,直接三分这个东西,复杂度 \(O(n\log^2 V)\)。
然后还有一些细节。在 slope trick 最后查询的时候询问的是 \(f_{n,x_0}\),这里 \(x_0\) 是三分的 \(n \to 1\) 变化量,即查询折线上 \(x=x_0\) 位置的纵坐标。不妨假设 \(x_0\) 在最小值平台的右侧,考虑平台右侧每个点对 \(x_0\) 纵坐标的贡献,因为每个点代表斜率增加 \(1\),所以一个点的贡献即 \(x_0 - x\),把这些贡献都加起来即可,注意还有初始的最小值平台的高度。\(x_0\) 在平台左侧同理。
对于最小值平台高度的维护也是类似的,每次加绝对值函数时平台的左端点一定还在平台上,所以考虑绝对值函数对平台左端点的贡献,即左端点的横坐标绝对值。
另外,由于初始只有 \(f_{0,x_0} = 0\),其余位置应为无穷大,因为本题的斜率最大值只有 \(O(n)\),所以我们给左右堆提前加入 \(n\) 个点表示斜率无穷大即可。
T4
长 \(n\) 的 01 字符串,每次由 \(p\) 点跳到 \(q\) 点会使得 \(q\) 点颜色翻转,代价为 \(f(|p-q|)\),\(f(x) = Ax^2 + Bx\),执行 \(q\) 次修改,每次修改字符串某一位或者查询以某位为起点,所有颜色都一样的期望代价。
\(1 \le n,q \le 10^6\)
期望线性性,高斯消元特殊矩阵优化。
CF1965D Missing Subarray Sum
给定一个回文数组 \(\frac{n(n+1)}{2} - 1\) 个不同子区间的值,请还原出任意一个满足条件的回文数组。
\(1 \le n \le 2000\)。
考虑我们如果知道所有子区间怎么做。
一种办法是,由于所有关于回文中心对称的数组只会出现奇数次,我们可以找到这些区间,然后从最大值开始相邻作差即可还原出整个序列。
另一种办法是,找到序列最大值,删掉他,然后次大值就是最大值删了 \(a_1\) 或 \(a_n\),这显然可以找到 \(a_1\) 的值,进而我们可以得到 \([2,n-1]\),然后把 \([1,n],[1,n-1],[2,n],[2,n-1]\) 都删掉,那么剩下的就一定是 \([1,n-2]\) 了,递归下去,我们就能还原出所有的位置。
分析删了一个数对这些区间的影响。第一种办法只有删除的是最大值时才能正确还原,那么就能还原出整个序列,第二种办法只有删除的不是最大值时才能还原,发现两种办法互补了,拼一下即可,这个是好判断的。
两种办法的复杂度都是 \(O(n^2\log n)\)。
CF1333E Road to 1600
何意味。
首先 \(n \le 2\) 一定无解,\(n = 3\) 时能找到一组解是:
发现我们需要让剩下部分车和后的行动轨迹一致,最后进入这个 \(3\times 3\) 的位置跑一遍车就赢了。
这也是好构造的,考虑类似螺旋式的,把这个矩阵放在左上角,让螺旋的终点在第一行或第一列即可。
CF1103C Johnny Solving
给定一张无向图,每个点的度不小于 \(3\),找到一条长度不小于 \(\frac{n}{k}\) 的路径或者找到 \(k\) 个环,环长不为 \(3\) 的倍数且每个环至少有一个点只属于这个环。
\(1 \le n,k \le 2.5\times 10^5\)。
随便建出一棵生成树,考虑 \(\frac{n}{k}\) 的限制相当于限制了树高 \(< \frac{n}{k}\),那么就至少有 \(k\) 个叶子,那么每个叶子至少有 \(2\) 条返祖边,那么至少会形成 \(3\) 个环,能发现这三个环 \(\bmod 3\) 不同,那么显然能找到一个不为 \(3\) 的倍数的,然后就做完了。
对于三个环的奇偶性,设叶子为 \(x\),其两条返祖边指向的点为 \(y,z\) 且 \(dep_z < dep_y\),记经过 \(x,y\) 的环长为 \(xy\),那么显然有 \(xz - xy + 2 = xzy\),显然至少有一个不是 \(3\) 的倍数,所以一定有一个合法。
CF1444D Rectangular Polyline
显然可以 \(O(\frac{n^2}{w})\) 把匹配方案求出,考虑怎么构造。
其实随便编一下就可以发现,加的时候按照 \(x\) 大,\(y\) 小排一下,回来按 \(x\) 小 \(y\) 大排一下就行了。
\(\text{day3}\)
76 + 100 + 0 + 92 = 268
这分数是人类吗,T1 输入的数组开小了挂 24,T4 随机化随到了最差的分数,其实再多随一次就稳定通过了,挂 24 + 8。
开场发现 T1 怎么这么困难,想了半天都只会三个状态的 dp,猜测一定要结论扔掉一维,发现所有 \(1\times k\) 的可以任意拼,不需要与当前形态相关,\(2\times 3\) 和 \(3\times 3\) 的直接横着放,这一定不劣,然后就只需要暴力枚举 \(2\times 2\) 了,1h 左右才通过,大概算了一下这个时候应该已经劣势了,开始猛冲,开场读题的时候发现 T4 的随机化应该不好卡,决定把 T2 过了扔了 T3 就直接做 T4。发现 T2 是个斜率优化的板子,抄了个李超树半小时就过了,然后开始乱搞,拼完 T4 暴力发现没发 checker,捣鼓了半天发现 vscode 编译 ifstream 有点问题,变成 dev 就行了,然后编了半天的随机化,在 11 点多调出来了,发现这东西直接通过了全部大样例,但是感觉时限卡的很紧,就只敢随一次,最后发现 T3 读错题了。。。。
我擦,SDSC 原来真有四个原创题的场。
T1
给定一个 \(n\times 3\) 的网格图,给定若干不大于 \(3\times 3\) 的木块,每个木块带权,求出放置的最大价值。
\(1 \le n \le 1000\)
注意到除了 \(2\times 2\) 都只需要体积够就行,枚举 \(2\times 2\) 的数量即可,复杂度 \(O(Tn^2)\)。
T2
给定序列 \(a\),最大化长偶数的子序列价值,价值定义为 \(b_1b_2 + b_3b_4 + \dots\)。
\(1 \le n \le 10^5\)。
考虑暴力转移,写出式子 \(f_i = \max_{j=1}^{i-1} (a_ia_j + g_{j-1})\),显然可以斜率优化,复杂度 \(O(n\log n)\)。
注意到对于一个位置 \(i\),跟单调栈中第二大的元素配对一定不优,因为最大和次大匹配一定更优,均摊只有 \(O(n)\) 个转移位置,复杂度 \(O(n)\)。
T3
博弈抽牌游戏,两人均不知道牌堆中每张牌点数,A 每次可以拿不超过 \(k\) 张牌,或者放回若干张,然后拿走第一张,B 只会每次拿一张,求所有 \(n!\) 中牌堆数值方案中 \(A\) 的得分和。
\(1 \le n \le 2000\)。
显然 A 每次回拿满 \(k\) 张牌,每次放回去也只会拿手上一张最大的一张最小的,把小的扔给 B,因此我们只需要对 \(A\) 能看到的牌数计数即可。
每次 A 还需要牌堆中至少还有 \(2\) 张牌,否则游戏就结束了,于是对剩下的牌数数数,记最大能看到的牌数是 \(M\)。
一张牌被保留当且仅当比他大的牌小于 \(\frac{n}{2}\),于是我们直接枚举这张牌 \(i\) 和比他小的牌数 \(k\),显然方案数为 \(\binom{k}{n-i}\binom{M-k-1}{i-1}\),记得给相同的牌重标号,复杂度 \(O(n^2)\)。
T4
给定一张无向图,边有三色之一,找出一棵有 \(r\) 条红边,\(g\) 条绿边,\(b\) 条蓝边的生成树。
\(1 \le T \le 10,1\le n \le 2000,1 \le m \le 2\times 10^5\)。
随机化过了。
考虑随便找一棵生成树,然后暴力插边找环调整,随机一下边集即可通过。
然后被 hack 了,两个团中间连一条边。
考虑分类讨论,假设图联通:
-
如果删掉任意一种边后图仍然联通,我们直接找出 \(r+g+b\) 条边,显然此时会连成若干联通块,由于保证怎么删图都联通,所以两个联通块之间至少由两条不同颜色的边构成,一个点双内也至少有两条不同颜色的边,这样显然颜色会有交,找到这个颜色调整一下即可。
-
可能不是很懂。假设此时不是联通图了,记存在一棵 \(r\) 红边的树为红树,蓝树,绿树同理。我们找到红树任意一条红边,如果这条边不在绿树上吗,那么我们直接从绿树中删掉一条红边,再加上这一条,这应该是可以找到的,绿树蓝树同理,然后我们将已有的边两点缩成一个,这样递归构造下去,显然到最后是可以构造出一棵树的。
太长了,放个随机化做法。
\(\text{day4}\)
100 + 50 + 25 + 0 = 0
没睡醒的来了。
做了一万年 T1,想了好几个贪心发现直接 dp 就过了,开场的时候一眼把 T2 会了但是没看数据范围,写了个 2log 的上去,结果发现 \(n\le 10^6\),和暴力同分,最后没时间打 T3T4 了,什么玩意。
我是傻逼吗,后面的分明明很简单吧,不能再晚睡了。
T1
有 \(n\) 个价值为 \(a_i\) 的物品,两类优惠券,第一类代价为 \(b_i\) 能将物品变为 \(\frac{1}{2}\) 购买,第二类代价为 \(c_i\) 能将物品变为 \(\frac{1}{3}\) 购买。
\(1 \le n \le 2000\)。
猜测一定按照,不用,一类,二类的方式排列。
发现错了,考虑 dp,设 \(f_{i,j,k}\) 表示前 \(i\) 个物品,用了 \(j\) 个一类,\(k\) 个二类的方案,复杂度 \(O(n^3)\)。
注意到不用的一定会是一段前缀,最后一维不用记了,复杂度 \(O(n^2)\),可以通过。
发现刚才贪心的错误点只是因为相邻两个点可能交换,判一下就行了,复杂度 \(O(n\log n)\)。
\(O(n^2)\) 代码 \(\text{Submission}\)
T2
给定一棵树,按时间删掉前 \(i\) 条边,求每次删掉任意连边形成的直径长度最小值。
\(1 \le n \le 10^6\)。
把 \(10^6\) 看成 \(10^5\) 了怎么办。
反着加边,只需要每次更新直径,发现只需要拿不超过三个最大值或者拿一个最小值拼上来,分讨一下就行了。
T3
给定 \(d\),初始能力值任选,每次经过每个 \(i\) 时,带来的代价为 \(|d_i - x|^3\),\(x\) 为当前能力值,每经过一个 \(i\) 可以调整 \(x\),调整的代价为 \((x-x')^2\)。
\(1 \le n \le 10^5\)。
考虑暴力 dp,设 \(f_{i,j}\) 为经过第 \(i\) 关能力值为 \(j\) 的最小代价,复杂度 \(O(nV^2)\)。
发现瓶颈在于每次更改能力值的复杂度,这显然可以斜率优化,单调队列维护凸包即可,复杂度 \(O(nV)\)。
进一步地,发现每个 \(d_i\) 的代价是三次的,每次调整的代价是二次的,他们的差分分别为二次和一次,也就是说,不超过 \(\sqrt V\),\(d_i\) 的代价就会追上调整的代价。
因此我们发现值域只有 \(\sqrt V\),对任意序列都是成立的,复杂度 \(O(n\sqrt V)\)。
T4
有 \(n\) 个难度值为 \(d_i\) 的关卡,\(q\) 次询问,每次给定 \(x,y,a,b\),分别表示初始能力值,最终能力值,如果当前能力值为 \(x\),那么经过 \(x-a \le d_i \le x\) 的关卡会使能力值 \(+1\),经过 \(x < d_i \le x+b\) 的会使能力值 \(+2\),还可以用 \(1\) 代价使能力值 \(+1\)。
\(1 \le n \le 2\times 10^5,1 \le q \le 500,1 \le V \le 10^9\)。
考虑贪心策略,每次如果一个 \(+2\) 不会顶掉 \(+1\),就选 \(+2\),否则选 \(+1\),可以证明,但是忘了,感性理解一下。
考虑把值域上所有叠在一起展开,往前放即可,那么会形成若干连续段,就好判断是否有 \(1\) 会被顶掉了,模拟即可,单次询问复杂度 \(O(n)\),总复杂度 \(O(nq)\) 可以通过。
qoj14304
给定一棵树,一个联通块的代价为极差,求划分方案最大价值。
\(1 \le n \le 10^6\)。
考虑放缩,直接令一个数可以选 \(\times 1\) 或 \(\times (-1)\) 或不选,然后讨论一下转移即可。
\(\text{day5}\)
100 + 0 + 20 + 100 = 220
睡着了。前一天又晚睡了,导致早上精神十分萎靡,而且起晚了没吃上早饭。
开题。发现 T1 很诡异,T2 很诡异,T3 很诡异,T4 好像很正常。于是先做 T4,把 \(O(n^2k)\) 的 dp 写了,简单猜了一下感觉决策单调性很对,写完发现被小样例 hack 了。然后开始随机游走,发现找不到任何优化空间了,于是开始考虑把 \(\max\) 拆了,然后上 cdq 就变成斜率优化了,这东西好像能做单 log,我草是不是做完了,又想了一下 T1 发现很简单,写完已经 1h 了。感觉可以先把 T4 冲出来,这东西应该挺好写的吧...?
于是开始调单调队列优化,3h 的时候小样例过了大样例死了,遂红温,然后王娟随机游走到脸上了,发现标程就是 2log 做法,不是个门,为啥 2log 又能过 2e6 了,20min 改成李超树过了。
最后紧急拼了几个暴力上来,发现 T2 读错题了,我说怎么完全做不了...
T1
给定序列 \(a_i\),求有多少个 \(x\) 满足 \(a_1 \otimes x \le a_2 \otimes x \le \dots \le a_n \otimes x\)。
\(1 \le n \le 10^5,0 \le x,a_i < 2^k\)。
对每位分成若干相互无干扰的区间讨论一下即可。
T2
给定一棵树,每个点有高度和权值,选出一个点集,使得任意两点的路径高度 \(\min\) 等于这两点的高度 \(\min\),求出权值最大和。
\(1 \le n \le 10^5\)。
发现不需要选的点是联通块,于是按照高度从大到小加点,建出来一棵根是最小值的笛卡尔树,然后每次选出笛卡尔树上一条链即可,用 set 实现,复杂度 \(O(n\log n)\)。
T3
给定排列,每次可以交换两个相邻的差的绝对值大于等于 \(k\) 的位置,求最小字典序序列。
\(1 \le n \le 10^5\)。
注意到 \(<k\) 的相邻位置的相对关系一定不会改变,于是找出所有 \(<k\) 的点对,试做一条边,然后选最小的拓扑序即可,优化边数每次只建最近的即可,复杂度 \(O(n\log n)\)。
T4
给定序列 \(a\),定义区间价值为区间 \(\max\) 乘区间权值和,求把序列分成恰好 \(k\) 段的最小权值。
\(1 \le n \le 100000,1 \le k \le 20\)。
考虑把 \(\max\) 拆了,使用 cdq 分治。
相当于将 \(\max\) 拆成 \(i,j\) 分别到中点的权值 \(\max\) 的 \(\max\),考虑讨论一下这两个数的大小,按照偏序关系每次新加点,然后 \(\max\) 就没了。
剩下的东西就是一个斜率优化的板子,可以直接上李超树,复杂度 \(O(nk\log^2 n)\),发现斜率的点下标都单调,可以做到 \(O(nk\log n)\)。
\(\text{day6}\)
100 + 100 + 55 + 0 = 255
睡着。
感觉没什么好讲的啊,发现 T1 写的做法太劣了,本地卡着时限过,赛后发现线上线下都比本地快一万倍,那我卡一个小时的常数算什么。没什么区分度,T4 我怎么一分都不会。
不要乱拆期望啊,不然 T3 会少 20 分。
T1
给定一个 \(n\times n\) 的矩形,对每个点找出最大边长使得以这个点为左上角的正方形内出现的数的个数 \(\le k\)。
\(1 \le n \le 500\)。
很多做法啊,最快的一个好像是按照对角线枚举,然后均摊就对了。
T2
给定一棵树,边的权是编号,要求对每条边重编号,使得不存在一条边权上升的路径。
\(1 \le n \le 2\times 10^5\)。
典完了吧,考虑一个点的子节点一定一段权大的全选上,另一段全选下,然后暴力转移一下能不能选上/下即可,复杂度 \(O(n\log n)\)。
T3
给定权值序列,每次随机等概率选择相邻的两个数,合并为 \(\frac{a_i + a_{i+1}}{2}\),求最终期望值。
\(1 \le n \le 10^6\)。
神了,这是牛题。
考虑一个 dp,设 \(f_{l,r}\) 为区间 \([l,r]\) 合并后的期望权值,每次区间 dp 转移,\(f_{l,r} = \frac{\sum f_{l,k} + f_{k+1,r}}{r-l+1}\),显然这个是可以前缀和优化的,可以做到 \(O(n^2)\)。
不要像我一样傻缺,把期望拆掉导致转移带一些完全优化不掉的系数。
考虑期望的线性性,发现答案等价于每个点的权值乘一个系数,所以我们只需要 dp 这个系数即可,然后我们改一下 dp,设 \(f_{i,j}\) 表示前面还剩 \(i\) 个数,后面还剩 \(j\) 个数的转移系数。
每次可以从 \(i+j\) 个合并中选择一个前面与当前这段不相交的,选择一个后面与当前这段不相交的,还有选相交的,注意乘 \(\frac{1}{2}\),有转移:
然后整理一下,把期望拆掉,令 \(g_{i,j} = (i+j)!f_{i,j}\),那么有:
考虑这东西的组合意义,相当于在平面上向下走一步有 \(i-\frac{1}{2}\) 的权值,向左走有 \(j - \frac{1}{2}\) 的权值,求所有路径权值和。
显然路径有 \(\binom{i+j}{i}\) 条,每条的权值都是 \((i-\frac{1}{2})^{\underline{i-1} }(j-\frac{1}{2})^{\underline{j-1} }\),每次只需要查询 \(\sum f_{i-1,n-i}a_i\),于是预处理一下下降幂即可,复杂度 \(O(n)\)。
T4
给定 \(k\) 个序列,定义一个选择的序列权值为其前缀和的和,每次可以选择任意一个序列的开头,然后把开头弹掉,求权值最小值,给出 \(q\) 次修改,每次在某个序列开头或结尾加入一个数,每次修改后查询权值最小值。
\(1 \le n,q,k \le 3\times 10^5\)。
牛完了。
发现这题不找点性质连暴力都做不了,考虑每次取最小值的问题是,可能后面会有一些更小的数可以通过提前吃大的吃到他,于是我们考虑每次合并最小值和他前面的一个值。
但是合并后的值应该是什么呢,我们选两个连续段,交换论证一下,(很难)发现合并后的值是所有数的平均值。
于是我们就有做法了,每次合并最小值和他前面的一个段,循环往复,我们得到了若干段,两个段的合并贡献是简单的,于是直接做可以通过 \(70\) 分。
考虑维护这些段,显然段的增减是 \(O(n+q)\) 的,均摊的话可以拿棵平衡树直接维护。更简单的做法是把所有段跑出来排一下序,然后离线线段树维护每个段是否存在维护权值即可,可能会更好写一点,复杂度 \(O(n\log n)\)。
SP3912 MTREECOL - Color a tree
CF2001E2 Deterministic Heap (Hard Version)
AT_abc261_g [ABC261G] Replace
AT_agc049_d [AGC049D] Convex Sequence
P7718 「EZEC-10」Equalization
P9746 「KDOI-06-S」合并序列
CF1796E Colored Subgraphs
\(\text{day7}\)
60 + 15 + 100 + 70 = 245
最后一天。
前两题挂 125 什么鬼。没什么好说的,做的还是慢了,然后前面还是挂了,T4 胡出正解了但是没敲完,卡着最后 13 秒才交上。
T1
考虑 \(\prod (a + di) = d^n \prod (\frac{a}{d} + i)\),由于我们是有逆元的,把 \(\frac{a}{d}\) 变成逆元然后就是一个阶乘和阶乘逆元,超过 \(1145141\) 显然就是 \(0\),有不少 corner。
T2
考虑把连续段拿出来,注意到只需要最后一次删除合法前面都合法,所以枚举分段点看是否可以成为最后一次的中间值即可。
T3
送的吧,注意到颜色段数量每次增加 \(O(1)\),颜色段均摊,ODT 即可。
T4
考虑提前钦定,设 \(f_{l,r,k}\) 表示区间 \([l,r]\) 在前面删了 \(k\) 对的最大删除次数,复杂度 \(O(n^4)\)。
发现刚才转移很冗余,考虑直接维护 \(f_{l,r}\) 表示把 \([l,r]\) 删除前面需要的最小删除次数,摁着转移 \(O(n^3)\),最后再来一个 \(g_i\) 表示 \([1,i]\) 的最大删除次数即可,复杂度 \(O(n^3)\)。

浙公网安备 33010602011771号