社区讨论

关于 TLE

P2371[国家集训队] 墨墨的等式参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhz49hkv
此快照首次捕获于
2025/11/15 01:13
3 个月前
此快照最后确认于
2025/11/16 13:47
3 个月前
查看原帖
参考了 这篇题解
这份代码是 70 分。
TLE on 7, 8, 10, 12, 17, 18。
CPP
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 20, MAXM = 5e5 + 10;

int n, a[N], M;
bool f[MAXM];
ll l, r, g[MAXM];

void Get() {
    if (!M) return ;
    fill(g, g + M, 1e18), g[0] = 0;
    for (int i = 1; i <= n; i++) {
        fill(f, f + M, 0);
        int now = a[i] % M;
        for (int j = 0; j < M; j++) {
            if (f[j]) continue;
            int k = j, st = 0; ll mmin = 1e18;
            while (1) {
                if (mmin > g[k]) mmin = g[k], st = k;
                k += now, k -= (k >= M ? M : 0);
                if (k == j) break;
            }
            k = st;
            while (!f[k]) {
                g[k] = min(g[k], mmin), mmin = min(mmin, g[k]) + a[i];
                f[k] = 1, k += now, k -= (k >= M ? M : 0);
            }
        }
    }
}

ll Solve(ll x) {
    ll ret = 0;
    for (int i = 0; i < M; i++) {
        if (x >= g[i]) ret += max(0ll, (x - g[i]) / M + 1);
    }
    return ret;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (!M) M = a[i];
    }
    Get(), cout << (!M ? 0 : Solve(r) - Solve(l - 1));
    return 0;
}
但这样就是满分了。
CPP
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 20, MAXM = 5e5 + 10;

int n, a[N], M;
bool f[MAXM];
ll l, r, g[MAXM];

void Get() {
    if (!M) return ;
    fill(g, g + M, 1e18), g[0] = 0;
    for (int i = 1; i <= n; i++) {
        fill(f, f + M, 0);
        int now = a[i] % M;
        for (int j = 0; j < M; j++) {
            if (f[j]) continue;
            ll mmin = 1e18;
            for (int k = j, cnt = 0; cnt < 2; cnt += j == k) {
                g[k] = min(g[k], mmin), mmin = min(mmin, g[k]) + a[i];
                f[k] = 1, k += now, k -= (k >= M ? M : 0);
            }
        }
    }
}

ll Solve(ll x) {
    ll ret = 0;
    for (int i = 0; i < M; i++) {
        if (x >= g[i]) ret += max(0ll, (x - g[i]) / M + 1);
    }
    return ret;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (!M) M = a[i];
    }
    Get(), cout << (!M ? 0 : Solve(r) - Solve(l - 1));
    return 0;
}
求问原因。

回复

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

正在加载回复...