0%

START201——Permutation Cost Sum(排列成环,交换排序)

思路讲解

我们发现,即便我们选了一个这个O(1)的,解决简单问题(单组问题的方法),好像也没什么用?所以说问题难道是引导我们怎么直接计算这个东西?我只能说是无从下手呀。

Cycle decomposition of permutations

这个东西是什么意思那?

https://nor-blog.pages.dev/posts/2023-01-09-permutations-for-beginners/

其实就是排列成环。

我们发现这个无视距离的交换就非常适合用图论来分析。

最后时间复杂度是 O(NN)O(N\sqrt N)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
FOR(i, 1, N) {
if (fa[i] == i) {
ll freq = cnt[i];
if (freq == 1)
continue;
if (memo[freq]) {
ans += memo[freq];
ans %= mod;
continue;
}
ll lans = 0;
// 这里A的定义和题目里面反过来了,不过我认为都一样
FOR(a, 1, N) {
ll b = a - a / freq;
if (b > 1) {
// 前面是会变化的 b 来接手
lans += (freq) * (1 + b - 1) * (b - 1) / 2;
lans %= mod;
// 注意 b 的上限是 N
// 而不是 a
lans += (freq - 1) * (a + a) * (N - b + 1) / 2;
lans %= mod;
} else {
lans += (freq - 1) * (a + a) * (N - b + 1) / 2;
lans %= mod;
}
}
memo[freq] = lans;
ans += lans;
ans %= mod;
}
}

AC代码

https://www.codechef.com/viewsolution/1190700079

心路历程(WA,TLE,MLE……)