NOI2025 补题计划
1A. robot
考虑建分层图,注意到一个点有用的 \(p\) 的范围为 1 到度数,所以总共有用的点数为 \(O(m)\),如果从一个点走到另一个点但是 \(p\) 超过的终点的度数,那么让 \(p\) 强制指回该点度数。注意到如果此时这个点是终点可以不用指回去,再建一个新点表示钦定该点是终点,这样一共 \(O(n+m)\) 个点,跑最短路的复杂度是一个 log。
1B. sequence
一次操作后,两个相邻的数中至少有一个归零。这样我们可以通过将原序列划分为若干个段,每个段 \([l,r]\) 中选择一个点 \(k\),然后执行操作 \((l,l+1),(l+1,l+2),\cdots,(k-1,k),(r-1,r),(r-2,r-1),\cdots,(k,k+1)\),其中需要保证这些操作是合法的,合法指的是对于所有 \(l\le i<k\),操作后的 \(a'_i\le a_{i+1}\);对于右边同理。显然每一段至多有一个整数非零,且若有非零数则该数下标一定是 \(k\),并且下标奇偶性与 \(k\) 相同的数对终值的贡献为 1,不同的数对终值的贡献为 -1。这样,我们只要知道了 \(k\) 的奇偶性,就能算出最终剩下的那个值是多少。
首先对每个点预处理出 \(lft_i\) 表示首个满足 \(a'_i>a_{i+1}\) 的 \(i\),\(rht_i\) 表示首个满足 \(a'_i>a_{i-1}\) 的 \(i\),那么对于区间 \([l,r]\),\([\max(l,rht_r),\min(r,lft_l)]\) 内的所有下标都合法。然后再预处理出 \([l,r]\) 奇数下标之和 \(s_1\) 和偶数下标之和 \(s_0\),首先判掉 \(s_0=s_1\) 的情况,然后如果 \(s_0>s_1\) 那么最终合法的 \(k\) 就是上面区间中下标为偶数的所有数,反之同理。设 \(f_i\) 表示前 \(i\) 个数的答案,则枚举 \(j,k\) 可以做到三次方,预处理每个奇偶性的区间和和区间最小值就可以不用枚举 \(k\),复杂度平方,可以通过第一问。
上面的做法通过不了非 B 性质的第二问的原因是会算重,而一个序列会算重当且仅当存在 \([l_1,r_1],[l_2,r_2]\) 满足 \(l_2=r_2+1\),且两个序列中至少存在一个序列终值为 0,此时操作两个序列和操作 \([l_1,r_2]\) 结果相同。考虑强化限制使得一种划分方案恰好对应一个序列,令新的 \(rht_i\) 为首个满足 \(a'_i\ge a_{i-1}\) 的 \(i\)。可以发现此时操作 \([l_1,r_2]\) 不再合法,这样就不会算重了。做法类似第一问,复杂度平方。
1C. tree
2A. ternary
首先发现一个串是不动点当且仅当对于所有 1 其后面两位都相等,然后假设所有连续段长度都大于等于 2,忽略第一个 1 连续段之前的 0,那么如果设 \(p\) 为第一个 0 连续段的开头的下标,答案就是 \(n-p+1\)。再考虑第一个长度为 1 的连续段(设下标为 \(p\))和它后面的极长长度为 1 的连续段,分类讨论一下发现如果该连续段是 1 连续段,操作一次这一部分就没有贡献了;如果是 0 连续段,操作一次后在 \(p+1\) 开头会形成长度大于等于 2 的 0 连续段,贡献为 \(n-p+1\),而在其之后的极长长度为 1 的连续段都只会有 1 的贡献,相对于 \(n-p+1\) 可以忽略不计,显然如果之前存在长度大于等于 2 的 0 连续段的话那么这部分的贡献也忽略不计。
所以我们得出结论:若一个串为不动点,答案为 0;若该串不存在长度大于等于 2 的 1 连续段,答案为 1;否则设 \(p\) 为第一个长度大于等于 2 的 1 连续段之后的第一个 0 的下标,答案为 \(n-p+1\)。线段树维护它,复杂度一个 log。
2B. set
对 \(AND=x\) 计数太难做了,考虑容斥,钦定 \(AND\) 为 \(x\),剩下位随意,这就是一个子集容斥,容斥系数为 \((-1)^{|T|-|S|}\)。现在有两维 \(AND\) 限制了,考虑二维容斥,假设 \(F_{S,T}\) 为恰好 \(AND_P=S,AND_Q=T\) 的答案,\(G_{S,T}\) 为钦定 \(AND_P=S,AND_Q=T\) 的答案,则有式子
考虑到我们只需要用到 \(AND_P=AND_Q\),所以有
考虑到我们只需要求出所有 \(F_{S,S}\) 的和,考虑 \(G_{S',T'}\) 对答案的贡献:
考虑怎么求 \(G_{S,T}\)。先考虑如下子问题:给定 \(n\) 个数 \(a_i\),求 \(\sum_{S\subseteq\{1,2,\cdots,n\}}\prod_{i\in S}a_i\)。正常情况下这可以 DP,但是这不利于我们做原问题,我们希望将贡献拆到每一个点上;答案即为 \(\prod_{i=1}^n (a_i+1)\),证明考虑选 \(a_i\) 或选 \(1\) 的组合意义。回到原问题,考虑每个数对 \(G_{S,T}\) 的贡献:如果 \(S\subseteq i,T\not\subseteq i\),则 \(a_i\) 只能划到 \(S\) 中,贡献为 \(a_i+1\);如果 \(S\not\subseteq i,T\subseteq i\),则 \(a_i\) 只能划到 \(T\) 中,贡献也为 \(a_i+1\);如果 \(S\subseteq i,T\subseteq i\),则 \(a_i\) 都可被划到 \(S,T\) 中,贡献为 \(2a_i+1\)。乘起来就是答案。然而发现诸如 \(S\subseteq i,T\not\subseteq i\) 的限制并不好刻画,容斥一下可以得到:
设 \(f_S=\prod_{S\subseteq i}(a_i+1),g_S=\prod_{S\subseteq i}(2a_i+1)\),再将上述式子代回总式:
第二步转化利用了恒等式 \(|S\cap T|=|S|+|T|-|S\cup T|\)。至此式子全部转化为了两集合取或的形式,使用 FWT 做或卷积即可,可以通过 B 性质,拼上暴力计算 \(O(4^n)\) 的包可以获得 68 分。考虑到出错的原因在于 \(a_i+1=0\) 时不能除掉 0,套路性的考虑记录 0 的幂次,\(a_i+1=0\) 的贡献改为 \(1\times0^1\),这样每个数可以写成 \(a\times 0^b\) 的形式,做 FWT 时维护这个多项式,复杂度反正过不去,但是发现最终我们只需要用到 \(b=0\) 的数,而 \(b\) 不可能小于 \(0\),所以只有多项式的最低项才可能让最终 \(b=0\),那么我们运算过程中只记录最低项即可。需要重载一下新类型的加减乘除运算,复杂度 \(O(n2^n+2^n\log V)\)(懒得写线性求逆),获得 100 分。

浙公网安备 33010602011771号