0%

思路讲解

我们发现,即便我们选了一个这个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……)

思路讲解

注释非常详细,看注释就行。

AC代码

AC

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

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

思路讲解

遇到这种题目不要慌,首先不难发现是线性基。

接着我们不要一下子想特别复杂的情况,我们就想一想 K=2 的时候是怎么样的?

// 因为两段不同的段,相互遮盖的长度是一样的。
    // 奇数加奇数是偶数,偶数加偶数还是偶数
    // 遮盖以后都是加减偶数,并不会影响段的长度的奇偶性。

    这里用到了一个小技巧

就是这个我们知道,如果说我们只要求偶数长度子序列的
        异或最大值怎么办呢?
        这个时候可以给加入线性基的数字加一个标记,如果最后这个值有标记
        就说明是奇数长度子序列得到的和
        否则就是偶数长度子序列得到的和。

AC代码

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

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

思路讲解

其他都想到了,就是这个

reverse(all(wp));

需要hack数据才能想到。

其实1 1 之间不会相互影响,但是0 0之间会,把最重要的放在最远,避免互相影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	FOR(i,1,N){
// if(s[i]=='1') A[i]=i-1;
// else A[i]=N;
ll t=N;
if(s[i]=='1'){
t=i-1;
A.PB(t);
reverse(all(wp));
for(auto w:wp){
A.PB(w);
}
wp.clear();
}else{
t=i-1;
wp.PB(t);
}
}

AC代码

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

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

思路讲解

Codeforces Round 1048 (Div. 2)——E1. Maple and Tree Beauty (Easy Version)(背包问题)(子集枚举→能否凑出某个的和)

不难发现,用背包会TLE。

说实话,这个就真没招了,看题解吧。

其实用bitset 优化一下就能过去。

最后发现,我这样分一个if else 的反而更快

还有一种曲线救国方法。使用模板参数。

1
2
3
4
5
6
7
template <int maxn>
inline void __() {
// cin >> N >> K;
if (maxn <= N) {
__< min(maxn * 2, (int)MAXN) >();
return;
}

AC代码

https://codeforces.com/contest/2139/submission/337943651

O(N2/w)O(N^2/w) 的时间复杂度,能够过去。

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