社区讨论

本地和 CF 时间差异过大是什么原因

学术版参与者 6已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhj289wz
此快照首次捕获于
2025/11/03 19:31
4 个月前
此快照最后确认于
2025/11/03 19:31
4 个月前
查看原帖
题目:CF1542E2。
代码:
CPP
#pragma GCC optimize(2, 3, "Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 505

int n, ans, MOD, DE; ll f[2][MAXN*MAXN], s[2][MAXN*MAXN], sp[2][MAXN*MAXN], fac[MAXN], C[MAXN][MAXN];

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n >> MOD;
    DE = n*(n-1)/2; fac[0] = 1; for (int i(1); i<MAXN; ++i) fac[i] = fac[i-1]*i%MOD;
    for (int i(0); i<MAXN; ++i){C[i][0]=1; for (int j(1); j<=i; ++j) C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;} f[0][DE] = 1;
    for (int i(0); i<=2*DE; ++i) s[0][i] = ((i ? s[0][i-1] : 0)+f[0][i]) % MOD, sp[0][i] = ((i ? sp[0][i-1] : 0)+f[0][i]*i) % MOD;
    for (int i(1), c(1); i<=n; ++i, c^=1){
        for (int x(0); x<i; ++x) for (int y(x+1); y<i; ++y) (ans += s[c^1][x-y-1+DE]*fac[n-i]%MOD*C[n][i]) %= MOD;
        for (int j(0); j<=2*DE; ++j){
            f[c][j] = 0;
            (f[c][j] += (i-j)*(s[c^1][max(j-1, 0)]-s[c^1][max(j-i, 0)])%MOD+MOD+(sp[c^1][max(j-1, 0)]-sp[c^1][max(j-i, 0)])) %= MOD;
            (f[c][j] += (i+j)*(s[c^1][min(2*DE, j+i-1)]-s[c^1][j]+MOD)-(sp[c^1][min(2*DE, j+i-1)]-sp[c^1][j]+MOD)%MOD+MOD) %= MOD;
            (f[c][j] += f[c^1][j]*i) %= MOD;
            s[c][j] = ((j ? s[c][j-1] : 0)+f[c][j]) % MOD; sp[c][j] = ((j ? sp[c][j-1] : 0)+f[c][j]*j) % MOD;
        }
    }
    cout << ans;

    return 0;
}
输入数据:
CPP
500 1000000000
本地 NOI Linux 下是 1.5s 以内,但是在 CF 上的自定义测试中跑了 8.5s。使用的是 C++20。

回复

8 条回复,欢迎继续交流。

正在加载回复...