社区讨论

评测状态 Unaccepted 评测分数 9 求条

P1997faebdc 的烦恼参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhizknd7
此快照首次捕获于
2025/11/03 18:17
4 个月前
此快照最后确认于
2025/11/03 18:17
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5, K = 555; 

int n, m, k, sk, ID[N], L[K], R[K], a[N], sF[K][N], t[N], re[N], mode[K][K], q, town[N];

int getSum(int l, int r, int x) {
    return (l <= r ? sF[r][x] - sF[l - 1][x] : 0);
}

void init(int n) {
    k = sqrt(n);
    for (int i = 1; i <= n; i ++ )
        ID[i] = (i - 1) / k + 1;
    sk = ID[n];
    for (int i = 1; i <= sk; i ++ )
        L[i] = (i - 1) * k + 1,
        R[i] = min(n, i * k);

    for (int i = 1; i <= n; i ++ )  t[i] = a[i];
    sort(t + 1, t + n + 1);
    m = unique(t + 1, t + n + 1) - t - 1;
    for (int i = 1, x; i <= n; i ++ )
        x = lower_bound(t + 1, t + m + 1, a[i]) - t,
        re[x] = a[i], a[i] = x;
    for (int i = 1; i <= n; i ++ ) {
        if (i != 1 && ID[i] != ID[i - 1])
            for (int j = 1; j <= m; j ++ )
                sF[ID[i]][j] = sF[ID[i - 1]][j];
        sF[ID[i]][a[i]] ++ ;
    }
    for(int i = 1; i <= sk; i ++ )
        for (int j = i; j <= sk; j ++ ) {
            int maxSum = 0;
            if (i != j) {
                mode[i][j] = mode[i][j - 1];
                maxSum = getSum(i, j - 1, mode[i][j - 1]);
            }
            for (int k = L[j]; k <= R[j]; k ++ )
                if (getSum(i, j, a[k]) > maxSum || (getSum(i, j, a[k]) == maxSum && a[k] < mode[i][j])) {
                    maxSum = getSum(i, j, a[k]);
                    mode[i][j] = a[k];
                }
        }
}

int ask(int l, int r) {
    int maxSum = 0, nowMode = -1;
    if (ID[l] == ID[r]) {
        for (int i = l; i <= r; i ++ )
            if ((++ town[a[i]]) > maxSum || (town[a[i]] == maxSum && a[i] < nowMode)) {
                maxSum = town[a[i]];
                nowMode = a[i];
            }
        for (int i = l; i <= r; i ++ ) town[a[i]] = 0;
        return re[nowMode];
    }
    nowMode = mode[ID[l] + 1][ID[r] - 1];
    maxSum = getSum(ID[l] + 1, ID[r] - 1, nowMode);
    for (int i = l; i <= R[ID[l]]; i ++ )
        if ((++ town[a[i]] + getSum(ID[l] + 1, ID[r] - 1, a[i])) > maxSum || (town[a[i]] + getSum(ID[l] + 1, ID[r] - 1, a[i]) == maxSum && a[i] < nowMode)) {
            maxSum = town[a[i]] + getSum(ID[l] + 1, ID[r] - 1, a[i]);
            nowMode = a[i];
        }
    for (int i = L[ID[r]]; i <= r; i ++ )
        if ((++ town[a[i]] + getSum(ID[l] + 1, ID[r] - 1, a[i])) > maxSum || (town[a[i]] + getSum(ID[l] + 1, ID[r] - 1, a[i]) == maxSum && a[i] < nowMode)) {
            maxSum = town[a[i]] + getSum(ID[l] + 1, ID[r] - 1, a[i]);
            nowMode = a[i];
        }
    for (int i = l; i <= R[ID[l]]; i ++ ) town[a[i]] = 0;
    for (int i = L[ID[r]]; i <= r; i ++ ) town[a[i]] = 0;
    return maxSum;
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    cin >> n >> q;
    for (int i = 1; i <= n; i ++ )  cin >> a[i];
    init(n);
    
    for (int i = 1, l, r, lastAns = 0; i <= q; i ++ ) {
        cin >> l >> r;
        if (l > r) swap(l, r);
        cout << (lastAns = ask(l, r)) << '\n';
    }
    return 0;
}

回复

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

正在加载回复...