9.21 ~ 9.27 每周总结

9.21 ~ 9.27 周总。

学习成果

hy

写在前面,看着大家都有难度体系,那我也写一下吧。

  1. 微粒:一眼题。
  2. 水:想一想就做出来了。
  3. 岩浆:好好想就做出来了。
  4. 恒星:想不出来,看看题解能理解。
  5. 中子星:想不出来,题解能需要绞尽脑汁才能理解。
  6. 超新星:再见。

如果你看到了难度里有两个评级,一个 4~6 一个 1~3,大概率代表本题查看了题解并对不看题解做出评了个级。

不过我不太会给题评级www。

9.21 周一

下午开始集训,打模拟赛,link。

打的有点唐,T2 证出结论还是被击杀了,主要一直在想一开始构想的弱智做法,直接导致 T4 也爆了 www。

T1 起始标记

难度:微粒。

直接模拟,没有难度,环的问题就直接后一半和前一半合并就行。

从后往前扫的转向就是直接转整个坐标轴。

T2 前缀进位

难度:岩浆-。

一个数合法则其二进制子集都合法,故答案从高到低位填一定是不劣的。

问题变成判断一个数是否合法。

赛时的复杂化做法就不展开了,总想着把单个数所有合法数拆成区间做一些神秘操作。

不过可能是有启发意义的吧,由于操作是前缀加,于是很容易考虑从 \(n\to 1\) 枚举,其实由神秘做法可以得到每个数一定是将自己加到一个不能再小的下界上面,因为如果再加下去对自己没有帮助,反而可能危害后面的数,还不如让下一个数加。

现在假设枚举到 \(i\) 位,当前判断的数为 \(p\),总共已经加了 \(k\)。

那么当前数目前是 \(a_i + k\),那怎么求出上面提到的下界呢?

一定就是找到 \(a_i + k\) 和 \(p\) 中的最高位,使得 \(p\) 该位为 \(1\) 但 \(a_i + k\) 为 \(0\)。

然后下界就是让这个最高位往后全都和 \(p\) 相同,容易证明这样子加的数是最小的。

补习:C++ 自带的高优化二进制操作:

  1. __builtin_popcount(x) 返回 \(x\) 中二进制位 \(1\) 的个数,__builtin_popcountll(x) 为 long long 版本,下同。
  2. __builtin_ctz(x) 返回高位连续 \(0\) 的个数,可以求 upbit。
  3. __builtin_clz(x) 返回低位连续 \(0\) 的个数,可以求 lowbit。

T3 留白

难度:黑曜石(水/岩浆)。

直接上 \(\mathcal{O}(n^2\log n)\) 吧,\(\mathcal{O}(n^3)\) 疑似太简单了。

首先观察这个填法的结构,发现其在大部分时候连通块都是全连上的,只有一种对称的特例(o 为白点):

xoo
oxo
oox
oox
oxo
xoo

那我们是不是可以以这个断点进行划分,先看看单个段怎么做,先钦定每个段端点的黑点都不在中间。

设 \(dp_{i, j, 0/1, 0/1}\) 表示到 \(i\) 位连通块大小为 \(j\),开头黑点在哪,结尾黑点在哪。

为足够简约,由于每种方案将其上下翻转是相同的,于是只需要计算其中一种就行,状态变成 \(dp_{i, j, 0/1}\),只记录结尾状态。

两种转移:

ox
oo
xo
ooo
oxo
xox

也就是 \(dp_{i, j, o} = dp_{i - 1, j - 2, !o} + dp_{i - 2, j - 3, o}\)

求好每段之后,思考一下每段之间怎么合并,假设上一段状态是 \(o\),那么想凑出断点是不是这个段的开头就应该是 \(!o\),那这样的话只要确定好每一段的 \(o\),则方案是唯一的,那么这个记录的状态似乎就没有用了,直接转移 \(dp_{i, j, o} + dp_{i, j, !o}\) 不就好了。

设 \(s_{i, j} = dp_{i, j, 0} + dp_{i, j, 1}\)。

那么 \(s_{i, j} = s_{i - 1, j - 2} + s_{i - 2, j - 3}\)。

这样每段方案就求好了,并且知道了怎么合并。

那最大值的限制怎么解决呢?

枚举一个 \(y\),直接限制每一段都 \(\leq y\),这样求出来的方案数,便是恰好等于的前缀和,因为假如最大值严格等于 \(y - k\),则对应了所有恰好 \(y - k\) 的方案。

现在只需要用工具将每段合并起来就好了,当然是用多项式了。

发现每个合法结构都可以被划分成开头中间无数个段和结尾。

P|M|M|M|M|S

其中竖线表示:

o
x
o

那么开头和结尾会吃上连通块 \(+1\),中间会有 \(+2\),并且我们把中间的这个竖线分配给其前面的这个连通块,开头和中间的点数需要 \(+1\)。

于是设 \(R_j\) 为连通块数量 \(\leq j\) 的单段方案数的普通生成函数,多项式的指数表示点数。

则:

\[P_j = xR_{j - 1} \]

\[M_j = xR_{j - 2} \]

\[S_j = R_{j - 1} \]

该项方案数就是:

\[[x^y]\frac{P_jS_j}{1-M_j} \]

简单套用多项式板子就行。

复杂度 \(\mathcal{O}(n^2\log n)\)。

一个有趣的事情:\(s_{i, j}\) 其实是一个组合数,还是 \(k\) 维前缀和。

T4 单线巡查

难度:岩浆。

板子大战.jpg

首先这个联通的链不是很好做,不如将限制拆为每个点度数 \(\leq 2\) 并且联通。

我们发现前面这个度数的限制是满足单调性的,也就是包含一个非法区间的区间一定非法。

于是可以枚举 \(r\) 找到前面第一个 \(l\) 使得这个区间不合法,那么 \([l + 1, r]\) 就合法,并且这个 \(l\) 是单调的,所以直接双指针就好。

然后联通的限制用点边容斥轻松做到,知道所有第一个限制合法的区间了,直接查询区间最小值个数就行。

9.22 周二

dmy模拟赛 link。

困难无比!拼尽全力未能战胜 T2。

下午有点恍惚,没改题,写昨天 T3 \(n^2\log n\) 去了。

T1 中位数

难度:水。

首先一个数一定是原串,因为其中有最高的 \(1\),现在来找另一个数,一个容易想到的思路是让尽可能高的 \(0\) 变成 \(1\),因为这个带来的收益是低位永远做不到的,那么假设原串从最高位 \(1\) 开始是:

\[111\dots1000\dots0111 \]

那么要尽可能的让这些 \(0\) 变成 \(1\),并且不能改变更靠前的那个 \(1\),这就很简单了,直接找和这些 \(0\) 数量相等的后边的 \(1\),一定就是最大的了,不过如果 \(1\) 不够直接把 \(1\) 全丢过去就行了。

T2 🚇

难度:恒星/岩浆。

十分甚至九分的困难呐。

口胡吧,首先这个先发现一个上界 \(|d_i-d_j|\leq dis_{i, j}\),这个限制换一下就是 \(|d_i - d_{i + 1}|\leq L_i\)。

然后每个询问其实就是给每个 \(d_i\) 一个系数 \(c_i\),最大化 \(\sum{c_id_i}\)。

由于 \(\sum{c_i}=0\) 于是 \(d_i\) 可以整体加减数,找首都的限制直接就消失了。

能发现这个这个题就做完一半了www。

设差分 \(x_i = d_i - d_{i + 1}\),那么一定可以给 \(x_i\) 也找到系数 \(b_i\)。

则变成 \(|x_i| \leq L_i\) 且 \(\sum{x_i} = 0\) 使得 \(\sum{x_ib_i}\) 最大。

先按 \(b_i\) 排序,那么一定是前面一堆负的中间一个顶不满的,后面一堆正的。

于是可以找到 \(\sum{x_i}\) 正负的边界,前面都是 \(-L_i\) 后边都是 \(L_i\) 即可。

每次修改只是修改 \(L_i\) 不改变 \(b_i\),所以单点修就行。

复杂度是 \(\mathcal{O}((n+q)\log n)\) 的。

T3 布丁

难度:恒星/水。

这题也太布丁了。

首先通过 \(01010101010101 \to 00000000000000\) 这类东西可以感觉出来 \(f(n) \geq \lceil\frac{n}{2}\rceil\)。

打个表发现 \(f(4)\) 到 \(f(8)\) 分别为 \(6, 4, 5, 5, 5\),\(n \geq 9\) 时 \(f(n) = \lceil\frac{n}{2}\rceil\)。

于是可以爆搜 \(n = 9/10\),\(5\) 步使得 \(S\) 的十位和 \(T\) 相同。

最后剩下最多 \(18\) 位,折半搜就好。

这样太布丁了www,不过小小贪心大概就能获得 \(50\) 左右的分了。

T4 何移位?

难度:超新星?

?位移何移位?

完全不会,只能打 \(20\) pts。

暴力找环,然后质因数分解求 \(\operatorname{lcm}\)。

接下来是交互专题

CF1479A Searching Local Minimum

link

难度:水。

首先这个查询限制肯定就是二分状物了。

先将序列划分为许多单调的段,那么极小值一定在一个谷里。

那么假设出现了左边是单调减右边是单调增那么极小值一定在这里面。

于是直接二分,如果 \(mid\) 处在单调减里则移动左端点,否则移动右端点。

CF1407C Chocolate Bunny

link

难度:水+。

首先发现可以用两次操作获取到较小数的值,那么如果查询相邻数会导致极大值无法得知。

那为什么不直接扫一遍,维护前缀最大值,如果这个数小那么可以获得,否则更新最大值并知道以前的最大值的大小,最后剩下的数就是 \(n\)。

忽略两道微粒题。

[省选联考 2026] 排列游戏

不做评价,不做解释,我只知道我挂了 60。

CF1451E2 Bitwise Queries (Hard Version)

link

难度:水+。

假设 \(a_1 = 0\),那么可以用异或获得其他所有数的值。

于是只要获取了 \(a_1\) 的值就可以。

首先思考一下其实只有当两位相同时,我们才可以确定这位是什么,毕竟这些运算都是无序的嘛。

那么如果出现了两个相同的数,一定就可以获得这个数是什么,然后即可推出来所有数。

于是现在问题转化为了 \(a_i\) 互不相同。

那么一定会出现两个数 \(a_i\) 和 \(a_j\),其和 \(a_1\) 相同位的并集是满的,所以只需要随编找一下,就可以确定 \(a_1\) 的值了。

这交互题单也太水了。。。

CF2248F Matrix Elimination

link

难度:岩浆+。

有点神秘,不知道会不会被黑客攻击。

假设 \(a_{i, j} = \sum_{k=1}^{n}{v_{k, j}}+\sum_{k=1}^{n}{v_{i}{k}} - v_{i, j}\)。

首先先考虑直接做全局修,会使每个 \(a_{i, j}\) 减去 \(n + m - 3\),但如果没有全局修的话最优只能修改 \(\max(n - 1, m - 1)\),我们发现在 \(n > 1, m > 1\) 的时候一定是优的,于是问题变成了序列问题。

现在问题变成了两端可以减 \(n - 1\),中间可以减 \(n - 2\)。

直接做不好做,考虑二分答案,假设现在二分到了 \(k\)。

现在假设 \(a_1\leq a_n\),\(a_2\) 到 \(a_{n - 1}\) 单调递增。

那么先考虑 \(a_1\) 加入的情况。

设对其 \(n - 1\) 了 \(x\) 次。

那么有:

\[(n - 1)x + (n - 2)(k - x) \geq a_1 \]

\[(n - 3)x + (n - 2)(k - x) \geq a_K \]

\[0\leq x\leq k \]

化简一下就是:

\[a_1 - (n - 2)k\leq x\leq (n - 2)k - a_K \]

\[0\leq x\leq k \]

有解就可行。

如果 \(a_n\) 和 \(a_1\) 同时加入(不可能 \(a_n\) 单独加入)。

设 \(x, y\) 分别表示对 \(a_1\) 和 \(a_n\) 减 \(n - 1\) 的次数。

那么:

\[(n-1)x+(n-3)y+(n-2)(k-x-y)\geq a_1 \]

\[(n-3)x+(n-1)y+(n-2)(k-x-y)\geq a_n \]

\[(n-3)(x+y)+(n-2)(k-x-y)\geq a_{K-1} \]

化简一下变成:

\[x+y\leq a_{K - 1} - (n - 2)k \]

\[x-y\geq (n - 2)k - a_1 \]

\[y-x\geq (n - 2)k - a_n \]

变成关于 \(y\) 的不等式就是:

\[y\leq a_{K - 1} - (n - 2)k-x \]

\[x-(n - 2)k + a_1\geq y \]

\[y\geq (n - 2)k - a_n+x \]

此时我们发现 \(x\) 越大越不利于这个式子成立,于是直接让 \(x=0\)。

其实 \(x, y\) 是很像的,但是既然 \(a_n\geq a_1\) 所以肯定是操作 \(a_n\),这个在上面的式子里可以证明。

特判一下 \(k=n\) 的情况就行。

复杂度是 \(\mathcal{O}(n\log V)\) 的,感觉是能做到 \(\mathcal{O}(n)\) 的,不过没必要了。

9.23 周三

QOJ17962 exam

link

难度:水。

第一眼以为是困难题,结果直接折半搜就行了,折半状态设为前/后缀和最大值以及最大子段和,合并分讨一下就行。

实现起来有些小细节。

CF2252F Spectral Components

link

难度:岩浆。

首先肯定是每个颜色建出来一个虚树。

然后思考一下,如果 \(k = 1\),那么这个可以通过 DP 轻松求出,假设这个叫做这个颜色的重心。

那么我们感觉这个重心一定会包含在最终的答案。

感性理解一下,如果不包含,那么这个连通块在以重心为根的子树里面,由于在子树里,越往上爬越优,于是这个连通块向上移动一定会优,自然就一定要包括重心咯。

所以,先求出重心,然后问题又变成了一个往每个子树前进会有一些价值,要求价值和最大。

那么搞一个优先队列,每次提取一个点加上其价值,再把其子树全都丢进去。

这里不会出现为了后面更优的而先选个更劣的,因为越往下走越不优,即这个先后的价值是单调减的。

复杂度是 \(\mathcal{O}(n\log n)\) 的。

QOJ18302 Remix

link

难度:恒星+/岩浆+。

第一步先猜个容易发现的结论,先把最大值剔除在让剩下的值最小,证一证可得这个是对的。

手模一会发现,一个数的出现可以表示为一堆数减一堆数,于是问题变为了任选两个不同集合使其差值最小。

怎么证?

假设是集合 \(A\) 和 \(B\),要求给一个合理的操作顺序,使得不会出现负数。

那任选 \(a\in A, b \in B\),如果 \(a-b\leq 0\) 就丢到 \(B\) 里面,否则丢到 \(A\) 里。

接下来就抽象了:

\(n\) 个数的子集个数有 \(2^n\),但是这个的值域却只有 \(nV\),那么如果 \(2^n\geq nV\) 就一定有两个子集和相等,所以其实只用提取出一个大小为 \(22\) 的子集即可找到两个和相等的集合。

如果 \(n < 22\) 直接爆搜就行。

然后用上面提到的构造方式就行了。

复杂度 \(O(2^{\min(22, n)}+n)\)。

CF2246F Whoname and Unsorted Array

link

难度:恒星-/岩浆-/岩浆+。

有点糖了www。

挺结论性的题,这些结论我都不会证www。

一开始想把后 \(\frac{n}{2}\) 丢到后面然后判断一下,结果正确做法是把所有的数挨个丢到后面。

考虑从小到大将 \(i\) 丢到最后一位。

如果 \(a_1 = i\),那么需要先和 \(a_2\) 换一下,然后后面排好的会左移一位,先把 \(i\) 丢到最后面再操作 \(n - 1\) 就行了。

然后操作一下 \(i\) 所在位置的前一个位置就行。

最后如果剩下一个或两个数就没办法了,此时一定是:

\[n,1,\dots,n-1 \]

或:

\[n-1,n,1,\dots,n-2 \]

第二种情况只需要先操作 \(1\) 让 \(n\) 到结尾再操作 \(n - 1\) 即可。

第一种情况下需要交换 \(1\) 和 \(n\) 并保证后面 \(n - 2\) 个数不变,如果 \(n - 2\) 为奇数就没问题,否则就无解。

只需要操作 \(2\) 位置 \(n - 2\) 次即可。

最后操作一下 \(1\) 就好了。

操作次数显然符合要求。

这个题倒是有很多神仙做法,不过我都不会/kel

P11403 [RMI 2020] 软盘 / Floppy

link

难度:水+。

首先不可能刻画出排列的完整信息,因为 \(n!\geq 2^{2n}\),但是我们发现这个询问只需要知道笛卡尔树就行,我们没必要知道这个排列的具体信息。

而二叉树的方案数 \(\frac{\binom{2n}{n}}{n+1}\leq 2^{2n}\),这个直接展开 \((1+1)^{2n}\) 就能发现。

所以是可以表达出来的,考虑怎么表达,由于这个是笛卡尔树,那么笛卡尔树的建树方式中就有单调栈简述方法,直接写出来发现惊人现象,决定这颗笛卡尔树的形态的因素是对于每个 \(i\) 弹多少次栈,于是我们用 \(0\) 作为分割,连续的 \(1\) 表示弹栈次数。

另一边直接模拟一边就行,然后建出笛卡尔树一切都迎刃而解了。

复杂度:\(\mathcal{O}(n\log n)\),\(\log n\) 是求 \(\operatorname{LCA}\) 的复杂度,这个咋求都行。

9.24 周四

模拟赛,神秘恐怖 T4。

最终没能卡过 T3。

T1 序列(canyon)

难度:水。

假设选出来的区间 \(a_l < a_r\),那么其实就是每个点进行后缀加,前缀查询最大值,直接线段树就好,但是只能获得 70pts。

考虑优化,对于一个 \(a_l\) 我们肯定希望 \(a_r\) 越靠后越好,于是先找出最远的 \(r\) 使得 \(a_l < a_r\),于是询问变成了单点查询,直接上一个树状数组就行。

T2 树(tree)

难度:岩浆-。

挺有启发感。

直接做好像极其不好做,就算是找最靠前的不相等位也不好找。

突然想到在字符串里,这样的问题可以二分hash。

那为什么不二分hash呢?

具体而言就是直接对颜色出现次数hash,这个是可以做到单点修的,于是直接一颗主席树就行了。

记得用双模,也记得写主席树二分。

\[100\to 60 \]

T3 六元组(tuple)

难度:岩浆+。

大肠做法:

怎么搞似乎都不好做,于是选择投靠伟大的 sqrt technology,直接序列分块。

不过在此之前先处理一下 \(x_i\) 相等的情况,这个直接微小扰动一下就好,由 \(x_i\notin [l_i, r_i]\) 可以证明不会产生影响。

然后大胆的序列分块,三元环的贡献被拆成了三种,假设 \(p\) 为散点,\(s\) 为整块:

  1. \(p\to s\to p\)
  2. \(p\to s\to s\)
  3. \(p\to p\to s/p\)

第一种贡献:

这个可以直接预处理,假设现在是 \(i\) 块,先枚举所有的块内元素,然后对于这里面的每个元素都再有一个可达区间,这个区间内的散点直接区间 \(+1\),整块先不管。

这个区间 \(+1\) 直接差分就行。

复杂度 \(\mathcal{O}(n\sqrt n)\)。

第二种贡献:

刚才忽略的部分现在来考虑怎么求。

由于我们最外层需要的是一个区间内的答案,而每个块都会在其他块上产生一个表达式,那我们就像多项式一样维护一下这些系数不就好了?

也就是对于块 \(i\) 设 \(g_{i,j}\) 表示 \(j\) 块的系数,那么块内每个元素可达区间内的整块就直接 \(+1\)。

复杂度 \(\mathcal{O}(n\sqrt n)\)。

第三部分:

最无脑。

直接就是区间查询可以到达 \(i\) 的个数,这个直接差分扫一遍就行,用一个 \(\mathcal{O}(\sqrt n)-\mathcal{O}(1)\) 的分块维护区间加单点查就行。

复杂度 \(\mathcal{O}(n\sqrt n)\)。

总复杂度 \(\mathcal{O}(n\sqrt n)\)。

预计得分 80,经过超级卡常还是没卡过www。

小肠做法:

口胡的,没写。

直接无脑数点!

题目要求:

\[\sum_{a, b, c}{[l_c\leq a\leq r_c][l_a\leq b\leq r_a][l_b\leq c\leq r_b]} \]

差分变为:

\[\sum_{a, b, c}{([a\leq r_c]-[a\leq l_c-1])([b\leq r_a]-[b\leq l_a-1])([c\leq r_b]-[c\leq l_b-1])} \]

于是只用处理:

\[\sum_{a, b, c}{[a\leq x_c][b\leq x_a][c\leq x_b]} \]

先去掉第一维限制,直接从高到低枚举 \(a\),将满足的 \(c\) 插入。

剩下两维考虑变成一维修改一维查询,每次改变 \(a\) 都进行矩形的竖半平面加,插入 \(c\) 进行横半平面查询即可。

这个东西用 KDT 维护貌似是错的?反正过不去就对了。

考虑用二维分块维护这个。

修改操作就是对每个块加上小于等于这个修改值的数的个数,查询就直接查块的值就行。

复杂度是 \(\mathcal{O}(n\log n + n\sqrt n)\) 的。

T4 图(graph)

难度:中子星++。

只改了 34pts。

首先是一个叫做 product trick/sum 的东西,感觉就是字面意思,把 prod 变成 sum。

把 \(\prod{(deg_i+t)}\) 拆成关于 \(t\) 的多项式:

\[\sum_{S}t^{n-|S|}\prod_{i\in S}deg_i \]

然后 \(\prod_{i\in S}deg_i\) 其实就是每个点选一个存在的边的方案数,于是直接设 \(dp_S\) 表示集合 \(S\) 内的点都钦定了边,转移先考虑这个边是否被断开,没有被断开就考虑边的端点是不是要钦定这条边即可。

复杂度 \(\mathcal{O}(m2^n)\),获得 21pts。

然后加入分层之后怎么办呢?

直接枚举相邻两层的钦定情况,先转移两层之间的边,也就是设 \(P_{S, T}\) 表示本层钦定了 \(S\),下一层被两层之间的边钦定了 \(T\),转移完了之后将初值赋给 \(dp_{T}\) 就好了。

复杂度 \(\mathcal{O}(m2^{2k})\),获得 34pts。

然后就是口胡部分了。

首先这个过程很能优化,就是假设一个点根本就没有任何连向其的边考虑过,那这个点就不用加入到 \(S\) 中,反过来,如果一个点的边全被考虑过了的话这个点也不用加入到 \(S\) 中了,这样貌似复杂度是 \(\mathcal{O}(m2^{1.5k})\) 的。

然后更进一步的优化是先转移本层连向下一层只有一条边的,对于剩下的点,设其连边的两个点为 \((x,y)\),我们视作在 \((x,y)\) 之间连了一条虚边。这样下一层的点就形成了若干联通块。我们把联通块按照 点数 \(-\) 边数 从小到大排序。对于每个联通块,拎出一颗 dfs 树,并以 dfn 序的形式加入每一个点。对于本层的每个点 \(u\),当与它连边的两个点 \((x,y)\) 都加入以后,转移并删掉 \(u\)。此时 \(S\) 内的元素个数不会超过 \(k+1\),复杂度 \(\mathcal{O}(2^k m)\),预期得分 \(100\)。

其实好像很有道理。

9.25 周五

上午大战旷野小计算。

难度:岩浆+++(恒星+)。

我觉得这个题评到岩浆也太难听了www,偷偷放一个自己做的但是恒星的题。

题解

下午神秘校庆,差点累死了。

回家休养生息。

休养生息不能这么用!

9.26 周六

颓废了,模拟赛秒了两个题就逃跑了。

没想到 Div.2 这么简单,后面的题也不难,失误了()

T1 蜗蜗的休息日程

难度:微粒/水。

直接猜从前到后扫一边能填就填满,可以用假设-调整法(自己起的名字)轻松证明。

复杂度 \(\mathcal{O}(n)\) 为啥要开 \(10^5\)?吓得我以为猜假了。

T2 蜗蜗的计算日志

难度:水-。

直接写出转移,假设工作到 \(x_i\) 最快需要 \(s_i\),将最少删除变成最多加入,则设 \(dp_i\) 表示枚举到 \(i\) 并选了 \(i\) 时最多能加入多少个。

发现两个之间能转移的冲要条件是:

\[s_i-s_j\leq t_i-t_j \]

也就是 \(t_j-s_j\leq t_i-s_i\)。

所以直接将所有 \(s_i-t_i\) 离散化就可以用树状数组轻松转移。

不过 \(t_i\) 不是整数有点烦,小数离散化容易挂,直接全都乘上 \(\operatorname{lcm}\),由于 \(t\) 的取值并不多,手动算一下等于 \(277200\)。

细节有点多,大样例很水,牛魔的轻松挂 100。

过了两个样例 + 五个下发样例的程序交上去得到 0pts 见过没。

T3 蜗蜗的反馈灯阵

难度:岩浆-/岩浆。

难度主要是我调了好半天提上去的(

我以为是啥难题呢,直接没看haha。

首先如果不考虑那个不可重的限制是简单的。

直接设 \(dp_{i, j, k}\) 表示到 \(i\) 钦定有 \(j\) 个灯亮目前有 \(k\) 个灯亮,转移直接分讨一下当前点亮不亮就行。

但是这个完全就是错,题目要求不可重欸。

似乎有点难做了?

考虑什么时候我们会算重,也就是什么时候会发生一个局面产生多个 \(k\)。

首先一定要改变亮灯数量才行,这个是显然的,于是只能是将一个亮的灯和一个灭的灯进行交换,使得一个灯 \(+1\) 一个灯 \(-1\)。

假设这两个灯分别为 \(x, y\),亮了 \(j\) 个灯,那么这时就有 \(r_x = j - 1, r_y = j - 1\)。

有可能再改变两个灯的时候发生问题吗?不可能,因为单个点的亮灯数量至多改变 \(1\)。

于是我们发现如果出现一个亮的和一个不亮的并且它们都有 \(r_x = j - 1\),则会发生重复统计,所以只需要给它们钦定好顺序就好了。

我们钦定先出现的亮后出现的不亮,大概就是假设现在序列里有 \(k\) 个位置满足 \(r_x = j - 1\),那么有且仅有一个 \(t\) 使得 \(t\) 前面(包括 \(t\))\(r_x = j - 1\) 的都亮,后面都不亮。

故设 \(dp_{i, j, 0/1/2}\) 表示目前 \(r_x = j - 1\) 的结尾是没有/亮/不亮。

转移没有 \(1\to 2, 1\to 0, 2\to 0\)。

注意该灯不亮时候的边界问题!

或许需要挂个代码?

T4 蜗蜗的频段配对

难度:恒星-/岩浆

最后一步的 trick 没想到。

首先感觉 \(\varphi(p_ip_j)\) 很唐,直接拆了:

\[\varphi(p_ip_j)=\frac{\varphi(p_i)\varphi(p_j)\gcd(p_i, p_j)}{\varphi(\gcd(p_i, p_j))} \]

一个显然的思路是枚举 \(d=\gcd(p_i, p_j)\),但是这个限制太强了。

考虑 \(\frac{d}{\varphi(d)}\) 是什么,假设 \(d=\prod{p_i^{k_i}}\),则有:

\[\frac{d}{\varphi(d)} = \frac{\prod{(p_i - 1)}}{\prod{p_i}} \]

所以假设 \(d'|d\) 显然有 \(\frac{d'}{\varphi(d')}\leq \frac{d}{\varphi(d)}\)。

于是变成了每个 \(d\) 有一个序列,其中元素满足 \(d|p_i\),这样是 \(\mathcal{O}(n\log n)\) 数量级的。

然后有一个小 trick 区间任选两个乘积最大只需要找到每个数的后面/后面第一个比其大的就好了(感觉又该训数据结构了www)。

所以现在就是对每个数在每个 \(d\) 的序列用单调栈维护一下前驱和后继,将其变为三元组 \((i, j, \varphi(p_ip_j))\)。

然后就是经典的二维数点了,直接排个序另一维修就行,查询就是区间最大值。

9.27 周日

哈哈,今天写了一天周总,没想到吧!

或许晚上还会有文化课时刻?

如果有错别字,学会忍受,懒得改www。

posted @ 2026-09-27 19:28  QEDQEDQED  阅读(35)  评论(8)    收藏  举报