模拟赛好题鉴赏
由于已退役,本文章公开
本合集的共同点:复杂度分析
忘了 T3
有一个比赛有 \(m\) 道题目,每题有一个满分 \(k\)。现在给定 \(n\) 个人在各个题目里的得分情况(第 \(i\) 个人在第 \(j\) 题的得分为 \(a_{i,j}\)),你可以隐藏一些 \(a_{i,j}\),但是你需要保证隐藏分数之后任意将这些被隐藏的分数设为 \([0,k]\) 里的整数后所有选手的排名均与真实的排名一样。求出最多可以隐藏多少个分数。
\(1\le n \le 20000\),\(m,k\le 100\)。
待补
忘了 T1
给定一个无向图,需要对全部点 \(i\) 求出最短的起点和终点都在 \(i\) 的经过至少一个简单环的路径长度 \(l\)。特别的,你只用输出 \(\lceil\frac{l}{2}\rceil\)。
\(n \le 5000\)。
考虑对于每个点单独求答案。直接从每个点开始 bfs,那么如果过程中出现了 \(u\) 要拓展的点 \(v\) 已经被访问过的情况,那么答案显然就是 \(dis_u+1\),原因比较显然。
然后你发现直接这样 bfs 复杂度就是对的。为什么呢?因为你相当于是每条遍历到的边要么拓展到一个新的点上,要么就直接找到答案了。所以这样 bfs 就是对的,\(O(n^2)\)。
忘了 T3
对于一个值域为 \([1,m]\) 长为 \(k\) 的序列 \(A\),称一个映射 \(f: [1,m]\mapsto [1,m]\) 为序列 \(A\) 的逆转函数当且仅当 \(f(A_1)=A_k,f(A_2)=A_{k-1},\cdots,f(A_n)=A_1\)。现在给你一个长为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\),你需要对于其所有子区间求其逆转函数个数并求和。
\(n\le 3\times 10^5\)。
如果一个序列存在一个逆转函数,那么它显然有 \(m^{m-cnt}\) 个逆转函数(其中 \(cnt\) 为这个序列中数的种类数)。因此我们只需要判定一个区间是不是存在逆转函数即可很方便的计数。
有一个很显然的性质是如果区间 \([L,R]\) 存在逆转函数,那么 \([L+1,R-1]\) 也存在。还有一个不那么显然的性质,就是如果 \([L,R]\) 和 \([L,R']\) 均有逆转函数(\(R \gt R'\)),那么 \([L+R-R',R]\)(即 \([L,R']\) 对称过来)也存在。这个可以通过一些手玩得到。
这说明存在逆转函数的区间具有类似回文串的性质。考虑使用 Manacher 维护以一个位置为中心极长的存在逆转函数的区间。我们对于每个数 \(a_i\) 记录其上一次出现的位置 \(pre_i\) 与下一次出现的位置 \(nxt_i\),那么 \([L,R]\) 能够拓展为 \([L-1,R+1]\) 当且仅当 \(pre_R\le L\) 或 \(a_{L+R-pre_R}=a_L\),且 \(nxt_L\ge R\) 或 \(a_{L+R-nxt_L}=a_R\)。直接做 Manacher 就可以求出来所有中心最远能拓展到的位置。
现在的问题是怎么求答案。设点 \(x\) 为中心最远能够拓展到 \([x-k_x,x+k_x]\) 这个区间。考虑对于每个点 \(x\) 维护以其为中心的所有区间的答案总和 \(S_x=\sum_{i=0}^{k_x}m^{m-cnt(x-i,x+i)}\),并在 Manacher 扩展的同时转移。设目前最右边的合法串右端点是 \(r\),且中心在 \(c\),那么如果 \(k_{2c-x}\le r-x\) 则 \(S_x\) 可以直接由 \(S_{2c-x}\) 转移得到,因为以他们为中心的每一对区间出现数的种类数都相同。否则有 \(k_{2c-x}\gt r-x\),此时会被 \(r\) 的限制卡住,则不能直接从 \(S_{2c-x}\) 转移得到。但是有暴力做法:我们显然能 \(O(1)\) 的从 \(cnt(L,R)\) 递推到 \(cnt(L+1,R-1)\)(利用 \(pre\) 和 \(nxt\) 数组),所以可以直接缩小 \([2c-x-k_{2c-x},2c-x+k_{2c-x}]\) 这个区间到我们想要的长度,然后再进行转移。缩小的次数为 \(k_{2c-x}-(r-x)\),由于 \(2c-x+k_{2c-x}\le r\),可以得到 \(k_{2c-x}-(r-x)\le r-(2c-x)-(r-x)=2x-2c\)。由于这次转移之后新的 \(c\) 就会直接变成 \(x\),所以实际上我们用 \(O(x-c)\) 的代价把 \(c\) 右移到了 \(x\)。因此这样做复杂度就是线性的。

浙公网安备 33010602011771号