社区讨论

求分析复杂度

P10194[USACO24FEB] Milk Exchange G参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjoi8dr
此快照首次捕获于
2025/11/04 05:55
4 个月前
此快照最后确认于
2025/11/04 05:55
4 个月前
查看原帖
在统计答案的部分(区间加等差数列),我本意是先暴力加,再改成一阶差分,最后改为二阶差分,这样一步步来。
暴力加(注释掉的)只能过 Sub1 和 Sub3。改成一阶差分后(下面的代码),循环还是二维的,我觉得复杂度没变,但是直接过了,而且速度和二阶差分相差并不大。
所以我想问一问,暴力加改成一阶差分的这一步是否有复杂度上的优化,还是说是常数问题 / 数据问题?
一阶差分的代码:
CPP
for (int i = 1;i <= n;i++) {
    if (l[i] == -1) continue;
    int p = min(i - l[i], r[i] - i);
    int q = max(i - l[i], r[i] - i);
    // for (int j = 1;j <= p;j++) c[j - 1] += j * a[i];
    for (int j = 1;j <= p;j++) c[j - 1] += a[i], c[p] -= a[i];
    // for (int j = p + 1;j <= q;j++) c[j - 1] += p * a[i];
    c[p] += p * a[i], c[q] -= p * a[i];
    // for (int j = q + 1;j <= r[i] - l[i] - 1;j++) c[j - 1] += (r[i] - l[i] - j) * a[i];
    for (int j = q + 1;j <= r[i] - l[i] - 1;j++) c[q] += a[i], c[r[i] - l[i] - (j - q)] -= a[i];
}
for (int i = n + 1;i <= n + n;i++) {
    if (l[i] >= n) continue;
    int p = min(n - l[i], r[i] - i);
    int q = max(n - l[i], r[i] - i);
    // for (int j = 1;j <= p;j++) c[j - 1 + i - n] += j * a[i];
    for (int j = 1;j <= p;j++) c[j - 1 + i - n] += a[i], c[p] -= a[i];
    // for (int j = p + 1;j <= q;j++) c[j - 1 + i - n] += p * a[i];
    c[p + i - n] += p * a[i], c[q + i - n] -= p * a[i];
    // for (int j = q + 1;j <= r[i] - l[i] - 1;j++) c[j - 1 + i - n] += (r[i] - l[i] - j) * a[i];
    for (int j = q + 1;j <= r[i] - l[i] - 1;j++) c[q + i - n] += a[i], c[r[i] - l[i] - (j - q) + i - n] -= a[i];
}
for (int i = 1;i <= n + n;i++) c[i] += c[i - 1];
for (int i = 1;i <= n;i++)
    cout << c[i] << "\n";

回复

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

正在加载回复...