社区讨论
关于 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 条回复,欢迎继续交流。
正在加载回复...