ABC396F 题解

ABC396F 题解

题目链接

定义

定义 \(k=p\) 时:

  • \([x+1,n]\)\(b\) 等于 \(m-1\) 的数的个数为 \(f(p,x)\)
  • \([1,x-1]\)\(b\) 等于 \(m-1\) 的数的个数为 \(g(p,x)\)
  • \(b_x\) 的值为 \(b^k_x\)
  • \(b_x=y\)\(x\) 的个数为 \(c^k_y\)​。

问题分析:从简单入手

我们先来考虑 \(k=0\)\(k=1\) 这两种简单情况。

\(k=0\) 时,树状数组求逆序对解决之。

\(k=1\) 时,本质上变化的只有 \(b^0_x=m-1\) 的那些数。考虑其中一个数 \(b^0_x\)

  • 考虑它原本贡献的逆序对数,为 \(n-x-f(0,x)\)。这个要减去。
  • 考虑它变成 \(0\) 之后贡献的逆序对数,为 \(x-1-g(0,x)\)。这个要加上。
  • 最终 \(k=0\)\(k=1\) 答案的变化量为:

\[x-1-g(0,x) - (n-x-f(0,x))=2x-1-n+(f(0,x)-g(0,x)) \]

推广结论

\(k=q\) 时,类似地,我们有 \(k=q-1\)\(k=q\) 的答案变化量为:

\[x-1-g(q-1,x) - (n-x-f(q-1,x))=2x-1-n+(f(q-1,x)-g(q-1,x)) \]

原因显然,我们在分析 \(k=1\) 时的过程中没有用到其独有的特殊性质。因此这个式子同样适用于 \(k=q\) 的过程。

转化条件

我们考虑转化当 \(k=p\) 时,\(a^k_x=m-1\) 这个条件。

\(k=p\) 时,\(a^k_x=m-1\) 等价于 \((a^0_x+p)\bmod m=m-1\)

即,\(a^0_x+p=m-1\)\(a^0_x+p=rm-1\),其中 \(r \ge 2\)

考虑后者是否可行,由于 \(0\le p \le m-1\),于是有 \(a^0_x=rm-1-p\ge (r-1)m \ge m\),矛盾。

所以可以得出结论:当 \(k=p\) 时,\(a^k_x=m-1\) 等价于 \(a_x^0=m-1-p\)​。

问题缩小:\(f\)\(g\) 怎么求?

现在关键问题是如何计算对于每个 \(x\) 算出 \(f(p,x)\)\(g(p,x)\)

根据上面的转化,\(g(p,x)\) 等价于求出 \(y \in [1,x-1]\)\(a^0_y\) 等于 \(m-1-p\) 的数有多少个。

观察到每次我们都只是在计算形如 \(g(q-1,x)\) 的这么一个式子。发现里面的 \(x\) 都保证 \(a^{q-1}_x=m-1\)(我们本身枚举的就是这些 \(x\)),即 \(a^0_x=m-q\)。我们要找到 \(y\in [1,x-1]\)\(a^0_y=m-q\) 的数的个数。

即,本质上,我们对于每个 \(a^0_x\) 都要找到 \([1,x-1]\) 中等于 \(a^0_x\) 的数的个数。写一个树状数组,预处理即可。

而对于 \(f(p,x)\),显然 \(x\) 一定满足在 \(k=p\) 时,\(a^k_x=m-1\) 条件(理由同上),于是 \(f(p,x)=c^p_{m-1}-1-g(p,x)\)​。

复杂度分析

由于每个数最多变成一次 \(m-1\),因此对于每个 \(k\) 直接枚举 \(k-1\) 时哪些数为 \(m-1\),这么做不会不会超时,总时间复杂度为 \(O(m)\)​。

前面我们需要使用树状数组预处理出 \(g\) 的值,复杂度为 \(O(n \log n)\)

因此综上所述,该算法的复杂度为 \(O(n \log n)\),可以通过本题。

代码

posted @ 2025-03-13 21:35  邻补角-SSA  阅读(74)  评论(0)    收藏  举报