【题解】[AGC036F] Square Constraints

传送门

给定 \(n\),求长为 \(2n\)\(0\)\(2n-1\) 的排列 \(p\) 的个数,满足 \(n^2\le i^2+p_i^2\le 4n^2\)\(0\le i\le 2n-1\)),\(1\le n\le 250\)


这题调了我三天,基本被抬走了…… AC 的时候血压骤降。

解析

把题目中的条件转换成几何形式,即 \((i,p_i)\) 在内半径为 \(n\),外半径 \(2n\) 的圆环内。如图给出了一个 \(n=2\)\(p=\left<2,3,0,1\right>\) 的例子:

考虑没有内圆时的做法,即存在一个序列 \(r_i\),要求 \(p\) 满足 \(r_i\ge p_i\)。这是一个平凡的问题,即将 \(r\) 升序排序,第 \(i\) 位的选择数就是 \(r_i+1-i\)(每一位初始有 \(r_i+1\) 种选择,而有 \(i\) 种被占掉了,因为排序后之前的选择一定都被这一位包含),即答案就是 \(\prod\limits_{i=0}^{2n-1}(r_i+1-i)\)

有内圆怎么做呢?设内圆产生的下界为 \(l_i\),先考虑将 \([l_i\le x\le r_i]\) 类似的条件转换成 \([x\le r_i]-[x\le l_i-1]\),接下来是一步经典的容斥转换:设 \(f(k)\) 为选 \(k\) 个数选择 \(l_i\) 为上界的方案数,则最终答案为:

\[\sum\limits_{k=0}^n (-1)^kf(k) \]


考虑 dp 求解 \(f(k)\),即令 \(f_{i,j}\) 为对于前 \(i\) 个数,选取 \(j\) 个以 \(l_x\) 为上界的方案数。注意到方案数的关键在于排序,即计算多少个数影响了该决策,即小于自身。

\(i<n\) 时,以 \(l_i\) 为第一关键字,\(r_i\) 为第二关键字排序;当 \(i\ge n\) 时以 \(r_i\) 为关键字排序后,考虑以下转移(下文 \(i\) 代表原先下标,\(i^\prime\) 代表排序后的下标):

\(i\ge n\) 时,即不存在 \(l_i\),此时造成影响的有:

  • 小于自身的 \(r_x\),即 \(x>i\)\(x\ge n\),设有 \(cnt_1\) 个;
  • 可能选择的 \(l_x\),即 \(j\)

这种转移的贡献是 \((r_i-cnt_1-j+1)f_{i^\prime-1}{j}\)

考虑 \(i<n\),此时有两种决策:

  1. 选择 \(l_i\) 为上界,则造成影响的有:
    • 满足 \(r_x<l_i\)\(r_x\),和前面相同,也是 \(cnt_1\) 种贡献;
    • 满足 \(x>i\)\(l_x\),注意此时的贡献数是 \(j-1\),因为已经钦定了一个位置选择 \(l_x\) 为上界。

此时贡献是 \((l_i-cnt_1-j+2)f_{i^\prime-1,j-1}\)(注意代码里还是 +1,因为下标不同)。

  1. 选择 \(r_i\) 为上界,类似的有:
    • 满足 \(x>i\)\(r_x\),注意这不仅包括了 \(x\ge n\)\(n\) 个贡献(\(r_i\) 单调),还有满足 \(i<x<n\) 且取 \(r_x\) 的情况。则后者的贡献是总数 \(n-1-i\) 减去已经除去的 \(j\) 种,两类相加为 \(2n-1-i-j\)。(代码中用 lc 代替了后者贡献中的总数)
    • 满足 \(l_x<r_i\)\(x\),注意到这里有一个关键性质:所有的 \(l_x\) 都小于 \(r_i\),因为 \(r_i\ge r_n=\left\lfloor\sqrt{3n^2}\right\rfloor\ge \sqrt{n^2}\ge l_i\)。所以这一部分的贡献与钦定的 \(l_i\) 总数有关,设其为 \(k\)

此时贡献是 \((r_i-2n+i+j-k+2)f_{i^\prime-1,j}\),若用 \(lc\) 表示则为 \((r_i-lc-k+j+1)f_{i^\prime-1,j}\)

\(f(k)=f_{2n, k}\),最终整体统计答案即可。每次指定 \(k\) 进行 dp 复杂度 \(\mathcal{O}(n^2)\),总共 \(\mathcal{O}(n^3)\),可以通过。

注意事项

  1. \([l\le x\le r]\) 转换成 \([x\le r] - [x\le l-1]\) 别忘了 -1;
  2. 循环边界,循环边界,循环边界!怎么强调都不为过!\(f_{x,k}\) 算了吗?\(f(0)\) 算了吗?
  3. dp 数组清空了吗?dp 初始值设了吗?
  4. dp 顺序的排序,注意关键字的顺序和大小关系。
  5. 有没有输出负数?

Code

posted @ 2021-10-01 21:34  5ab  阅读(135)  评论(0编辑  收藏  举报