关于莫队分块块长RE问题
  • 板块学术版
  • 楼主coder2009
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/1/25 20:32
  • 上次更新2025/1/26 09:38:54
查看原帖
关于莫队分块块长RE问题
675208
coder2009楼主2025/1/25 20:32
//    int len = sqrt(1ll * n * n / m);
//    int len = n / (sqrt(m));
    int len = sqrt(n);

原题为AT_abc293_g,此题中在设置块长时如果使用上述被注释掉的两种写法就会有三个点 RERE,而直接开 n\sqrt n 的块就不会有问题

#include <bits/stdc++.h>

using namespace std;
#define ll long long

const ll maxn = 2e5 + 5;
int a[maxn],  L[maxn], R[maxn], p[maxn];
ll res, cnt[maxn], ans[maxn], t[maxn];
struct node {
    int l, r, id;
} q[maxn], qt[maxn];

bool cmp(node x, node y) {
    if (p[x.l] != p[y.l]) {
        return x.l < y.l;
    } else if (p[x.l] & 1){
        return x.r > y.r;
    } else {
        return x.r < y.r;
    }
}

void solve(int x, ll v) {
    res -= t[cnt[x]];
    cnt[x] += v;
    res += t[cnt[x]];
}

void best_coder() {
    for (ll i = 3; i <= maxn - 5; ++i) {
        t[i] = t[i - 1] + (i - 2) * (i - 1) / 2;
    }

    int n, m;
    cin >> n >> m;

//    int len = sqrt(1ll * n * n / m);
//    int len = n / (sqrt(m));
    int len = sqrt(n);
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        p[i] = (i - 1) / len + 1;
    }
    int num = n / len + (n % len != 0);
    for (int i = 1; i <= num; ++i) {
        L[i] = R[i - 1] + 1;
        R[i] = i * len;
    }
    R[num] = n;

    int l = 0, r = 0;
    for (int i = 1; i <= m; ++i) {
        cin >> q[i].l >> q[i].r;
        q[i].id = i;
    }
    sort(q + 1, q + 1 + m, cmp);
    for (int i = 1; i <= m; ++i) {
        while (l < q[i].l) {
            solve(a[l++], -1);
        }
        while (l > q[i].l) {
            solve(a[--l], 1);
        }
        while (r < q[i].r) {
            solve(a[++r], 1);
        }
        while (r > q[i].r) {
            solve(a[r--], -1);
        }
        ans[q[i].id] = res;
    }
    for (int i = 1; i <= m; ++i) {
        cout << ans[i] << '\n';
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    best_coder();

    return 0;
}

附上完整代码

2025/1/25 20:32
加载中...