Atcoder abc330
https://atcoder.jp/contests/abc330
G - Inversion Squared
a[n]
$a[i] \in [1,n]$ 或$a[i]=-1$, 1~n最多出现一次
-1能替换成$[1\cdots n]$中的数
求 所有 ((a能产生的$1\dots n$排列)的逆序对的个数)的平方和,mod 998244353
n = 3000
2s
1024mb
我的思路
题面很质朴,n 3000说明可能n^2一类的算法
令x=-1的个数
对于非-1的部分可以直接算出,然后乘上 (x)! 就是贡献了
对于-1和-1之间,要知道每一个 排列的方案,交换这两个位置 对应的也是一个方案,而这两个方案之间 一个贡献1,一个贡献0
所以 是 $x!\frac{(x-1)x}{2}\cdot \frac{1}{2}$, 分别是 总方案数,配对位置数,和1/2的平均贡献
那么这个问题来到的就是 -1和给定值之间的逆序对 的贡献个数了
contribute[有值pos1] = f_left(value,left -1 count) + f_right(value, right -1 count)
所以 如果能 计算出
$f(value,cnt)=$ 在一共x个-1的情况下,左侧-1的位置有cnt个,当前值是value,的方案数
l[v] =
比v小的未填的值的个数
那么左侧的贡献为 $cnt\star (x-l[value]) (x-1)!$
右侧的贡献为 = $(x-cnt)\star lvalue!$
似乎就没了吧?
xxxxxxxxxxxxxxxxxx上面读错题目了, 要逆序对个数 的平方和,不只是逆序对的个数和
已经填好的逆序对=C,-1内部的逆序对=A,-1和填好的逆序对=B
$(C+A+B)^2=C^2+A^2+B^2+2AB+2BC+2CA$
首先C是不变的,A,B是根据填写情况变化的
所以这里的$C^2+2BC+2CA$很好算,和上面一样,
那问题来到$A^2,B^2,2AB$怎么算
一个想法是和上面一样,考虑两个位置交换会对贡献有什么影响
显然一样的, 交换2个位置,那么它们的A相差为1,问题是B是可能变化的,且变化无法确定
A^2 也有办法,因为A^2相当于x个数的全排列的 逆序对平方和
1 | len=1:0 |
个数上可以 生成函数表示
$f_0(x)=1$
$f_1(x)=1+x=(1+x)f_0(x)$
$f_2(x)=1+2x+2x^2+x^3=(1+x+x^2)f_1(x)$
$f_3(x)=(1+x+x^2+x^3)f_2(x)$
这个 采取 分治的方法计算 $O(n^2 \log n)$ 可以算出来,但是 $2^{23} =8388608 > 4498500=\frac{2999\cdot 3000}{2}$ 这会炸掉吗?
然而这个思路带来的一个新的启发能否用 生成函数的方法 直接计算出每个逆序对的方案数,
例如 $f_3(x)=(1+x+x^2+x^3)f_2(x)$ 中$x^2$是 在说 对于后缀长度$4$的4个数字,第一个是其中第2+1小的(因为1-index所以+1),
想了想,好像并不行,虽然在-1的位置填入值的时候,可以计算和后面相比多少个,但是这里产生的分叉状态没法合并,意味着分叉的状态数量会影响时间空间复杂度
题解
意义转化,abc277g !!!!!补过的,又忘了
就是 (逆序对平方) = 逆序对 x 逆序对= sum 四元组(l0,r0,l1,r1)满足 (l0 < r0,l1< r1,a[l0] > a[r0],a[l1] > a[r1]) 统计
q=未决定的个数
分类
- A: (l,r) 固定, a=好的pair个数,我们也只需要考虑好的个数
- B: (l,r) 其中一个固定
- C: (l,r) 都没固定,c=pair个数=$\binom{q}{2}$
因此 (l0,r0,l1,r1) 有
- (A,A)
- (B,B)
- (C,C)
- 2*(A,C)
- 2*(B,C)
- 2*(A,B)
(A,A): $a^2q!$ 显然
(A,B)(B,A):
- (i,q)
- (q,i)
1 | for i in 已经确定的 位置: |
(A,C)(C,A):
$a\frac{cq!}{2}\cdot 2$ 对于每个排列,的指定两个-1的位置,该排列和交换这两个位置的排列,有且只有一个产逆序对,所以$\frac{1}{2}$ 因为计数2次所以还是要再乘上2
(C,C):
- (l0,r0)=(l1,r1): $\frac{cq!}{2}$
l0=l1 and r0!=r1
,l0!=l1 and r0==r1
,一样的指定3个位置,看平均产出率$\displaystyle \frac{\binom{q}{3}q!}{3}\cdot 2\cdot 2$, 乘上2是因为r0,r1可以交换,另一个2是方案对称l0<r0=l1<r1
,l1 < r1 = l0 < r0
:一样的指定3个位置,看平均产出率$\displaystyle \frac{\binom{q}{3}q!}{6}\cdot 2$, 乘上2是2是方案对称- 4个坐标都不一样,一样$\binom{q}{4}q!\frac{6}{4!}\cdot 6$,选择位置,所有排列,产出率,和6种 下标关系
(B,C),(C,B):
先确定b,再看c
- 没有共用位置,$B确定 \star \binom{q-1}{2} (q-1)! \frac{1}{2}\cdot 2$
- 有共用位置
- b=(i,p),c=(p,q)贡献 $\displaystyle \binom{q-g[a[i]]}{2}\binom{gp[i]}{2}(q-2)!\cdot 2$, 值更小,坐标更大
- b=(i,p),c=(q,p)贡献 $\displaystyle ((q-gp[i])+\cdots+(q-1))(g[a[i]]+\cdots+(q-1))(q-2)!\cdot 2$,
- b=(p,i),c=(p,q)贡献 $\displaystyle (gp[i]+\cdots+(q-1))((q-g[a[i]])+\cdots+(q-1))(q-2)!\cdot 2$,
- b=(p,i),c=(q,p)贡献 $\displaystyle \binom{g[a[i]]}{2}\binom{q-gp[i]}{2}(q-2)!\cdot 2$,
(B,B):
- (i,p)(i,p):$gpi(q-1)!$
- (i,p)(i,q):$\displaystyle A_2^{gp[i]}A_2^{(q-g[a[i]])}(q-2)!$
- (p,i)(i,q):$gpi(q-g[a[i]])(g[a[i]])(q-2)!$
- (p,i)(p,i):$(q-gp[i])ga[i]!$
- (p,i)(q,i):$\displaystyle A_2^{q-gp[i]}A_2^{g[a[i]]}(q-2)!$
i < j
, 也只有这里需要n^2,上面都是O(n)以内就能算的, 见代码
(i,p)(j,p)
(p,i)(p,j)
(i,p)(p,j)
(i,p)(j,q)
(p,i)(q,j)
(p,i)(j,q)
a[i] > a[j]
a[i] < a[j] < a[p]
a[j] > a[p] > a[i]
(i,p)(q,j)
- 讨论坐标
- i < p < j
- i < j < p
- 讨论值
a[j] > a[i]
a[i] > a[p] > a[j]
a[i] > a[j] > a[p]
- 讨论坐标
也就AA(1)+AB(2)+AC(1)+CC(4)+BC(6)+BB(18) = 32种情况,讨论吐了150行
代码
https://atcoder.jp/contests/abc330/submissions/50047211
1 |
|
参考
https://atcoder.jp/contests/abc330/editorial/7765
总结
哎 我就觉得做过 这个 abc277g, arc157c
就是意义转化,应该是第二次遇到了,没想出具体转化好蠢啊我,
后面的推理到没啥难度了????,是亿点的很多体力活,哎abc277g