2025.7.14-7.16 NOI
笔试
\(100\),应该大多数人都是这个分数,目前我只知道两个非 \(100\) 的,都是 \(99\)
Day 1
\(8:00\) 开始,先开 \(\text T1\),先拿了 \(n,m,k\le1000\) 和 \(n,m\le5\times10^4,k\le 100\) 的部分分,然后拿了 \(\text A\) 性质,总计 \(60pts\),实际写到一半就大致想到正解了,但以为 \(\text T1\) 比较难,因此还是一档一档写,最终大约 \(9:15\) 左右过 \(\text T1\) 的 \(\text{selfeval}\)
之后看 \(\text T2\),写了暴力的 \(10pts\),然后开 \(\text{T}3\) 写了暴力 \(8pts\),之后回到 \(\text T2\) 拿了 \(\text A\) 性质的 \(10pts\),看 \(\text T3\) 发现 \(\text{AB}\) 性质有规律,拿了 \(8pts\),此时大约还剩一个半小时,剩余时间反复看后两题,但没有新的得分
最终得分 \(100+20+16\)
T1 机器人
一张 \(n\) 点 \(m\) 边的有向图,边有边权,点 \(i\) 有 \(d_i\) 条出边,编号从 \(1\) 开始,初始在 \(1\) 且 \(p=1\),每次可以用 \(v_p\) 的代价令 \(p\gets p+1\),或用 \(w_p\) 的代价令 \(p\gets p-1\),需要保证 \(1\le p\le k\),其中 \(\forall i,d_i\le k\),或走当前点的第 \(p\) 条出边,代价为边权,求从 \(1\) 到 \(1\sim n\) 中每个点的最小代价,\(n,m\le3\times10^5,k\le2.5\times10^5,\sum d_i=m\)
点 \(i\) 建立 \(d_i+1\) 个点,其中第 \(p\) 个点表示状态 \((i,p)\),第 \(d_i+1\) 个点表示到达点 \(i\) 且 \(p\) 不限
则对于 \(i\),\((i,p)\to (i,p+1)\)(边权 \(v_p\),\(p<d_i\)),\((i,p)\to(i,p-1)\)(边权 \(w_p\),\(p>1\))
对于点 \(i\) 的第 \(p\) 条出边 \((i,v,w)\),连 \((i,p)\to(v,d_v+1)\)(边权 \(w\))和 \((i,p)\to(v,\min(p,d_v))\)(边权 \(w+\sum_{x=\min(p,d_v)+1}^p w_x\))
转化为对于每个 \(1\le i\le n\),求出 \((1,1)\) 到 \((i,d_i+1)\) 的距离
总时间复杂度 \(O((n+m)\log(n+m))\)
T2 序列变换
对于序列 \(a_{1\sim n}\;(a_i\in\mathbb N)\),每次操作可选择一个 \(1\le i<n\),令 \(a_i\) 和 \(a_{i+1}\) 同时减去两者的较小值,给定 \(b_{1\sim n}\;(b_i\in\mathbb Z)\) 和 \(c_{1\sim n}(c_i\in\mathbb N^+)\),令 \(f(a)=\sum_{i=1}^n [a_i=0]b_i\),\(g(a)=\prod_{i=1}^nc_i^{[a_i=0]}\),对于 \(a\) 经过若干次操作得到的所有可能的最终序列,求出 \(f(a)\) 的 \(\max\) 与 \(g(a)\) 的 \(\sum\),\(n\le 5000\),多测 \(t\le20,\sum n\le4\times10^4\)
显然对于每个 \(1\le i<n\),若操作超过一次,则第二次及之后都不会产生变化,因此每个位置至多操作一次
定义 \(i\) 为 \(\text{L}\) 类的当且仅当操作了 \(i\) 且操作时 \(a_i\le a_{i+1}\),定义 \(i\) 为 \(\text R\) 类的当且仅当操作了 \(i-1\) 且操作时 \(a_{i-1}\le a_i\),定义 \(i\) 为 \(\text P\) 类当且仅当 \(i\) 不是 \(\text L\) 类且不是 \(\text R\) 类(其中 \(1\le i\le n\))
当 \(i\) 同时为 \(\text L\) 类和 \(\text R\) 类时,显然省略其中一个不会影响最终序列,因此假定 \(\text L\) 类和 \(\text R\) 类的位置集合交为空
显然 \(i\) 为 \(\text L\) 类时 \(i+1\) 不能为 \(\text R\) 类
因此可以划分为若干形如 \(\text L^x\text P\text R^y\)(\(x\in\mathbb N,y\in\mathbb N\))的区间
显然区间之间独立,因此单独考虑其中一个区间,记为 \((l,r,p)\),其中 \([l,r]\) 为整个区间的范围,\(p\) 为 \(\text P\) 的位置
操作结束后显然 \(a_{l\sim p-1}\) 和 \(a_{p+1\sim r}\) 都变为 \(0\),\(a_p\) 变为 \(\sum_{i=l}^r (-1)^{i-p}a_i\),因此可以认为操作顺序为 \((l,l+1),(l+1,l+2),\cdots,(p-1,p),(r-1,r),(r-2,r-1),\cdots,(p,p+1)\)
令 \(L_i\) 表示以 \(i\) 为右端点的 \(\text{PRRR}\cdots \text R\) 段的最小左端点,\(R_i\) 表示以 \(i\) 为左端点的 \(\text{LLL}\cdots\text{LP}\) 段的最大右端点,则区间 \((l,r,p)\) 合法的充要条件为 \(L_r\le p\le R_l\) 且 \(\sum_{i=l}^r (-1)^{i-p}a_i\ge 0\),\(L,R\) 容易 \(O(n^2)\) 计算(对于 \(L_i\),枚举 \(j=i\sim 1\),\(s\) 初始为 \(a_i\),每次令 \(s\gets a_j-s\),当 \(j<0\) 时退出,\(R\) 同理)
考虑区间 \([l,r]\),对于 \(l\le p\le r\),显然 \(\sum_{i=l}^r (-1)^{i-p}a_i\) 只和 \(p\) 的奇偶性有关
令 \(s=\sum_{i=l}^r (-1)^i a_i\),则 \(a_p\gets (-1)^p s\),当 \(s=0\) 时对奇偶性无要求,当 \(s<0\) 时 \(p\) 为奇数,当 \(s>0\) 时 \(p\) 为偶数(三种情况中都有 \(p\in[\max(l,L_r),\min(R_l,r)]\))
考虑第一问,令 \(f_i\) 表示 \([1,i]\) 中的答案,显然 \(f_0=0\)
枚举区间 \([l,r]\),令 \(s=\sum_{i=l}^r (-1)^i a_i\),\([ll,rr]=[\max(l,L_r),\min(R_l,r)]\),若 \(s=0\) 则
否则
预处理区间内奇偶下标的 \(b\) 的最小值容易做到 \(O(n^2)\)
第二问的计算方式类似,但是发现需要去重
当每次操作的 \(a_i\ne a_{i+1}\) 时,显然不会算重
在计算 \(L\) 和 \(R\) 时 \(s<0\) 的条件改为 \(s\le 0\),然后判断合法性时特判区间长度为 \(2\) 且两数相同的情况,即可做到不重不漏
总时间复杂度 \(O(n^2)\)
T3 数字树
给定一棵有 \(2n-1\) 个非叶子结点,\(2n\) 个叶子结点的二叉树,定义一个 \(\text{dfs}\) 序合法当且仅当按其顺序遍历叶子,依次记录存在标记的叶子的标记得到的序列可以通过消除相邻元素而删空,\(n\) 次操作,第 \(i\) 次给出两个叶子,两者标记上 \(i\),初始所有叶子都没有标记,且一个叶子不会被标记多次,求每次操作后合法的 \(\text{dfs}\) 序数量,\(n\le2\times10^5\)
定义结点的权值为 子树内出现恰好一次的叶子的标记的集合,权值相同的结点并入同一等价类
答案为 \(2^{2n-1-c}\),其中 \(c\) 为此时大小 \(>1\) 的等价类数量
证明:
- 题目保证最终一定有解,因此先交换一部分结点的左右儿子使得在最终状态下从左到右遍历的 \(\text{dfs}\) 序合法
- 显然大小 \(=1\) 的等价类中的结点是否翻转不影响合法性
- 显然大小 \(>1\) 的等价类恰好可以对应到树上两条不交的直链
- 设当前等价类中两个位置为 \(ab\),初始序列中排列为 \(abba\),则两条链操作次数奇偶性不同会出现 \(abab\) 或 \(baba\) 的情况,无法匹配
- 即两条链中操作次数之和必须为偶数
- 每个等价类会令合法操作次数减半,因此总方案数为 \(\frac{2^{2n-1}}{2^c}=2^{2n-1-c}\)
令 \(a_{i,j}\) 表示权值 \(j\) 在子树 \(i\) 中出现次数是否为奇数(实际为 \(1\))
将 \(a_{i,\ast}\) 按字典序排序,则 \(\forall i\),令 \(\max(\text{2nd}(a_i),\text{lcp}(a_{i-1},a_i)+1)\sim n\) 的 \(c\) 都加一,其中 \(\text{2nd}(a)\) 表示序列 \(a\) 中第二个 \(1\) 的位置,不存在则为 \(n+1\)
容易线段树合并维护 \(a\)
总时间复杂度 \(O(n\log^2 n)\),瓶颈在于排序
存在 \(O(n\log n)\) 的实现方法
Day 2
\(8:00\) 开 \(\text T1\),枚举 \(n=20\) 的所有情况,发现操作次数不超过 \(n+O(1)\),因此得到 \(O(qn^2)\) 的做法,得到 \(30pts\)
然后找规律过性质 \(\text A\),得到 \(15pts\)
继续找规律,发现先操作一次后,剩余操作次数为 \(n\) 减去 第一个长度 \(>1\) 的 \(1\) 连续段的结束位置,特判操作次数为 \(0\) 的情况,得到 \(O(qn)\) 的做法,得到 \(15pts\)
继续枚举 \(n=20\) 的所有情况,发现 当存在子串 \(101\) 且去掉后缀 \(1\) 之后不存在 \(11\) 的情况下答案为 \(1\),否则套用先前的方式
测试了一下发现暴力实现能有 \(55pts\),容易线段树优化到 \(100pts\)
此时大约为 \(10:30\)
然后开 \(\text T2\),\(O(3^{2^n})\) 实现了 \(n\le 4\),拿了 \(8pts\)
开 \(\text T3\) 拿了暴力 \(5pts\),回来看 \(\text T2\),发现最简单的 \(dp\) 可以做到 \(O(8^n)\),可过 \(n\le 8\),拿了 \(8pts\)
发现 \(\text T3\) 的 \(\text{dfs}\) 容易转化为记忆化搜索,又拿了 \(5pts\)
此时约 \(12:10\),之后 \(50\) 分钟没有得分
最终得分 \(100+16+10\)
T1 三目运算符
对于 \(s_{1\sim n}\),令 \(t=F(s)\),\(t_i=\begin{cases}s_i&i\le 2\lor s_{i-2}=0\\ s_{i-1}&\text{otherwise}\end{cases}\),给定 \(s\),\(q\) 次区间翻转(\(0,1\) 互换)操作,在所有操作前和每次操作后求出最小的 \(k\in\mathbb N\) 使得 \(F^k(s)=F^{k+1}(s)\),\(n,q\le4\times10^5,\),多测 \(t\le 5,\sum n,\sum q\le8\times10^5\)
可证当 \(s\) 存在子串 \(101\) 且去掉后缀 \(1\) 后存在子串 \(11\) 时 \(k=1\),否则 \(k\) 等于 \(n\) 减去第一个长度 \(>1\) 的 \(1\) 连续段的结束位置
容易线段树维护做到 \(O(\sum (n+m\log n))\)
T2 集合
注:\(U,P,Q\) 等为集合,\(\mathcal U,\mathcal P,\mathcal Q\) 等为集族
令 \(U=[1,n]\cap \mathbb N^+\),\(\mathcal U=2^U\),令 \(f(\mathcal P)=\bigcap_{S\in\mathcal P}S\mid \mathcal P\subseteq \mathcal U\),给定 \(a_S\mid S\in U\),求出 \(\sum_{(\mathcal P,\mathcal Q)\mid \mathcal P\subseteq\mathcal U,\mathcal Q\subseteq \mathcal U,\mathcal P\cap\mathcal Q=\mathbb\emptyset}[f(\mathcal P)=f(\mathcal Q)]\prod_{S\in(\mathcal P\cup\mathcal Q)}a_S\),\(n\le 20\),多测 \(t\le 3\)
由于 \([P=Q]=\sum_{A\subseteq P,B\subseteq Q}(-1)^{|A|+|B|}2^{|A\cap B|}\),因此答案等于
令 \(F(S)=\{T\mid S\subseteq T\subseteq U\}\),则转化为
枚举交集,则转化为
令 \(\mathcal S^m=F(A\cup C)\cap F(B\cup C)\),显然 \(\mathcal S^m=F(A\cup B\cup C)\),令 \(\mathcal S^a=F(A\cup C)/\mathcal S^m,S^b=F(B\cup C)/\mathcal S^m\),则有
因此答案转化为
令 \(f(S)=(-2)^{|S|}\prod_{X\supseteq S}(1+a_X)\mid S\subseteq U\),\(g(S)=2^{-|S|}\prod_{X\supseteq S}\frac{1+2a_X}{(1+a_X)^2}\),则转化为
容易 \(O(n2^n)\) 高维后缀和求出 \(f(S)\) 和 \(g(S)\)
得到 \(f(S)\) 和 \(g(S)\) 后容易 \(\text{FWT}\) 求出答案
总时间复杂度 \(O(\sum n2^n)\)
当 \(a_X\equiv -1\) 时,\(\frac{1+2a_X}{(1+a_X)^2}\) 会出错
考虑将 \(f(S)\) 和 \(g(S)\) 都记为 \(\sum_{i\ge 0}v_ix^i\mid x\to 0\)(其中 \(1+a_X\to 0\),即 \(\frac{1+2a_X}{(1+a_X)^2}=-x^{-2}\mid x\to 0\)),显然只需要记录最小的 \(i\) 使得 \(v_i\ne 0\) 和对应的 \(v_i\) 即可
时间复杂度不变

浙公网安备 33010602011771号