12 月杂题

12 月杂题

难度区分:Easy、Medium、Difficult、Impossible。

abc282_h Min + Sum (Medium)

Tag:分治。

由于刚做完 NOIP2025 T4,所以可以想到分治:

我们处理在当前分治区间内且跨过 \(mid\) 的区间。可以求出左半边的后缀最小值位置与右半边的前缀最小值位置。分两类:

  • 左边的后缀最小值 \(<\) 右边的前缀最小值。
  • 左边的后缀最小值 \(\ge\) 右边的前缀最小值。

以第一类为例,当左边取一个区间时右边取到一个前缀。而对于 \(b\) 的限制可以枚举左端点,右端点二分即可,复杂度 \(O(n\log ^2n)\)

arc146_c Even XOR (Medium+)

Tag:增量,DP。

考虑往 \(S\) 加入一个数 \(x\),什么时候合法。那么对于任意一个 \(S\) 的奇大小子集 \(T\) 要满足 \(T\) 内元素的异或和不等于 \(x\)

我们要求有多少种奇大小子集的异或和,这样就能求出能插入多少种数。

实际上,奇大小子集的异或和种类数就等于奇大小子集个数,这是因为不存在任意两个奇大小子集的异或和相等,否则把它们拼起来就不满足要求。

因此可以插入的数的个数为 \(2^n-2^{|S|-1}\)

可以 DP,设 \(f_i\) 表示 \(|S|=i\) 的合法 \(S\) 个数,则:

\[f_i=\frac {f_{i-1}\times (2^n-2^{i-2})}{i} \]

那么当 \(i>n+1\)\(f_i=0\),因此复杂度 \(O(n)\)

arc085_c MUL (Medium)

Tag:暴力、缩小规模。

适当缩小规模后跑暴力。考虑对于 \(\le n/3\) 的枚举每个数删或不删。

那么对于 \(>n/3\) 的分为两种情况,一种是 \(i,i\times 2\) 同时都还存在,另一种是只有 \(i\) 存在。前者有三种取法,取 \(i,i\times 2\)、取 \(i\)、什么都不取;后者就有两种取法,取 \(i\) 或不取 \(i\)

暴力枚举的部分剪枝后发现只有三百万种不同的方案,于是可以通过。

abc315_g Ai + Bj + Ck = X (1 <= i, j, k <= N) (Medium)

Tag:枚举、不定方程。

枚举 \(i\),转化为求 \(Bj+Ck=X\) 的满足条件的解的个数。

考虑 exgcd 求出不定方程的一组解,将解偏移(\(j\gets j+\frac {kB}{\gcd(B,C)}\)\(k\gets k-\frac {kC}{\gcd(B,C)}\)),然后可以找到 \(1\le j,k\le n\)\(j\) 最小的解,最后将 \(\min((n-j)/\frac{B}{\gcd(B,C)},(k-1)/\frac{C}{\gcd(B,C)})+1\) 累加进答案即可。

复杂度 \(O(n)\)

abc317_g Rearranging (Medium)

Tag:正则二分图完美匹配。

对每一行建左部点,每个值建右部点,对于 \((i,j)\) 从左部 \(i\) 连向右部 \(a_{i,j}\) 即可。

我们需要求出二分图 \(m\) 组完美匹配,方法就是每次找到一组完美匹配,然后把所有匹配边删掉,重复这个过程,这个过程是充要的。

abc313_g Redistribution of Piles (Medium+)

Tag:差分、类欧几里得算法。

首先不妨把 \(a\) 排序,考虑差分数组,操作一相当于把第一个不为 \(0\) 的位置减一,操作二相当于把 \(a_1\) 加一。

所以显然会做完所有操作一后再做操作二。枚举最后一个操作一操作的位置 \(i\),与 \(a_i\) 减了多少,可以算出总共删了多少个数 \(s\),对答案的贡献为 \(s/n\) 向下取整。

对于最后的位置 \(i\),每次 \(a_i\) 减一会使总共删了的数的个数加 \(n-i+1\)。所以对于 \(i\),对答案的贡献可以表示为:

\[\sum _{j=1}^{a_i} \lfloor \frac {S+j(n-i+1)} {n} \rfloor \]

可以用类欧几里得求上述式子,单次 \(O(\log V)\)。复杂度 \(O(n\log V)\)

关于类欧,这里讲得还算清楚

就是求如下式子:

\[f(n,a,b,c)=\sum _{i=0}^n\lfloor\frac{ai+b}{c} \rfloor \]

实现如下:

#define int __int128
int floor_sum(int n,int a,int b,int c) {
	if(a>=c||b>=c) 
        return (n*(n+1)/2%mod*(a/c)+(n+1)*(b/c)+floor_sum(n,a%c,b%c,c))%mod;
	int m=(n*a+b)/c;
	if(m==0) return 0;
	return (n*m-floor_sum(m-1,c,c-b-1,a)+mod)%mod;
}

abc312_g Avoid Straight Line (Easy)

容易发现合法的 \((i,j,k)\) 一定存在一个点 \(x\) 使得 \(i,j,k\) 分别在 \(x\) 的不同子树内。

于是处理出每个子树的 \(siz\),在上述 \(x\) 处计算答案,即可 \(O(n)\) 解决这道题。

abc311_g One More Grid Task (Medium)

Tag:二维转一维、枚举、单调栈。

首先一维的做法就是,枚举最小值,找到前驱比它小和后继比它小的数,求区间和即可。

二维的做法枚举行的区间 \([l,r]\) 然后即可转化为一维的问题,复杂度 \(O(n^2m)\)

P14798 [JOI 2026 二次预选] 购物 3 / Shopping 3 - 洛谷 (Medium)

\(a_i\) 排序后形成一个阶梯状物,每次把阶梯最底 \(D_j\) 层消掉,贡献为消掉的格子数减去 \(C_j\)

易知每次消掉的格子数是不上升的,因此二分出第一次使得消掉的格子数小于 \(C_j\) 的次数,这个次数减一即最优情况下的 \(k\)

由于二分时计算格子数还需要二分位置,因此复杂度是 \(O(n\log V\log n)\),其中 \(V\) 为值域。

P14800 [JOI 2026 二次预选] 船 / Ship - 洛谷 (Medium)

首先 \(n\) 为偶数时的答案就是 \(\min _{i=1}^{n/2} a_{i+n/2}-a_{i}\)

考虑 \(n\) 为奇数时,套用 \(n\) 为偶数时的做法。我们先取出一个长为奇数的等差数列,然后剩下的部分用偶数的做法。

枚举取出的等差数列的第一个和第二个数 \(i,j\),猜测后面的数取得越多越好。可以做到 \(O(n^3)\),打出来发现确实过了 \(n=700\) 的档。

考虑优化,加入剪枝:当 \(a_j-a_i\le ans\) 时直接不考虑,发现直接过了。

P7561 [JOISC 2021] 道路の建設案 (Road Construction) (Day2) - 洛谷 (Medium+)

考虑转化为切比雪夫距离。

二分出第 \(k\) 大距离的值。可以将点按横坐标排序后滑动窗口,用 set 将纵坐标插入,只要当某个时刻 \(\le mid\) 的点对数已等于 \(k\) 则退出。

求出第 \(k\) 大距离等于 \(ans\) 后,再跑一遍求出 \(\le ans\) 的所有点对。剩下的点对都是 \(=ans\) 的。

复杂度两个 $\log $。

P11239 [KTSC 2024 R2] 跳跃游戏 - 洛谷 (Difficult)

转移形如 \(f(i)=\max (f(i-1),f(i-K)+a_i)\),可以按照 \(K\) 分块。

每次可以从上一块同一个位置转移过来,或者取前缀最大值。

我们先求出所有 \(a_i\) 相等的区间,那么考虑一个区间在同一块里的情况,我们继承上一个块的信息,先将区间加 \(a_i\),然后将区间取前缀最大值。由于 \(f(i)\) 是不下降的,区间加完 \(a_i\) 后也是不下降的,因此能更新前缀最大值的位置是一个区间,用线段树维护即可。

因此我们对于区间 \([l,r,a]\) 依次做以下操作,维护前缀最大值 \(pmax\)

  • 对区间 \([l,r]\)\(a\)
  • 在区间 \([l,r]\) 内部在线段树上二分然后对 \(pmax\) 取 max,这可以在线段树上维护区间最大值与最小值并且维护覆盖标记。
  • 更新 \(pmax\)

而对于 \([l,r]\) 不在跨过块的情况,对于两边的散块拆成两个区间即可,对于中间的若干整块它们的操作都是一样的,除了第一个整块用上面的方法做外,其他整块都是全局加 \(a_i\)

复杂度 \(O(q\log q)\)

注意:对所有 \(l\bmod K,(r+1)\bmod K\) 离散化时,最后要把 \(0\) 插入,防止跨块的区间右端点消失。例如 \(K=4,[3,8]\)

agc076_a Hamming-Distant Arrays (Difficult)

考虑用总数减去不合法的方案数,即算存在 \(y\) 使得 \(\forall i,d(x_i,y) < n^2-n\) 的方案数。

我们先考虑一个必要条件,所有 \(x_i\)\(y\) 相同位数的个数的和 \(\ge n^2+n\)

由于 \(y\) 是任意的,上述条件就是,设 \(d_j\) 表示第 \(j\) 位在所有 \(x_i\) 中的众数次数,那么满足 \(\sum d_j\ge n^2+n\),其是不合法的必要条件。

实际上上述条件还是充分条件,下面我们构造性证明:

由于 \(\sum d_j\ge n^2+n\),因此我们可以先用 \(n\) 个位置使得所有序列匹配数的总和 \(\ge 2n\),而对于剩下的位置每次都取一个匹配数 \(<n+1\) 的序列与其匹配。完成上述过程最终一定能使每个序列的匹配数 \(\ge n+1\)

知道了充要条件后,由于 \(n\le 50\),直接 DP 即可,先算出一位上众数次数为 \(i\) 的方案数,预处理组合数可以做到 \(O(n^4)\)。然后再按每位的顺序 DP 序列,可以做到 \(O(n^5)\)

最后不要忘记用总方案数减去,总方案数是 \(n^{n^3}\)

P5278 算术天才⑨与等差数列 (Medium)

考虑哈希判断一个区间时等差数列。取一个随机奇数 \(base\),然后将区间的哈希值记作 \(\sum _{i=l}^r base ^{a_i}\),这个哈希值是容易在线段树上合并的。

我们求出区间的最小值和最大值,就可以用矩阵快速幂算出合法情况下区间的哈希值,复杂度 \(O(q\log n)\)

如果底数用偶数,那么在模 \(2^{64}\) 时就会死。

posted @ 2026-01-05 12:15  dengchengyu  阅读(5)  评论(0)    收藏  举报