40TLE,求调
查看原帖
40TLE,求调
595697
Papy楼主2025/1/18 22:41
#include <bits/stdc++.h>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 2e5+5;
const int maxb = 5e2+5;
const int maxq = 2e5+5;
int n, Q;
int len;
ll a[maxn];
int id[maxn];
ll ans[maxn];
unordered_map<ll, ll> cnt;
ll res, saveres;

template <typename type>
void inline read(type &x){
    x = 0; type f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9'){
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
        x = x*10+ch-'0', ch = getchar();
    x = x*f;
}

struct node{
    int id;
    int l, r;
}q[maxq];

struct node2{
    int l, r;
}blocks[maxb];

void build_blocks(){
    for (int i = 1; i <= n; i++){
        id[i] = (i-1)/len + 1;

        if (id[i-1] != id[i])
            blocks[id[i]].l = i;
        blocks[id[i]].r = i;
    }
}

unordered_map<ll, ll> cntt;
ll solve(int l, int r){
    cntt.clear();
    for (int i = l; i <= r; i++){
        cntt[a[i]]++;
    }
    ll res = -1;
    for (int i = l; i <= r; i++){
        res = max(res, cntt[a[i]]);
    }

    return res;
}

void add(int i){
//    printf("i=%d ai=%lld\n", i, a[i]);
    cnt[a[i]]++;
    res = max(res, cnt[a[i]]);
}

bool cmp(const node &a, const node &b){
    if (id[a.l] != id[b.l])
        return id[a.l] < id[b.l];
    return a.r < b.r;
}

int main(){
    read(n); read(Q);
    len = ceil(sqrt(n));
    for (int i = 1; i <= n; i++){
        read(a[i]);
    }
    for (int i = 1; i <= Q; i++){
        q[i].id = i;
        read(q[i].l); read(q[i].r);
    }

    build_blocks();
    sort(q+1, q+Q+1, cmp);

    int l = 0, r = 0;
    for (int i = 1; i <= Q; i++){
        int ql = q[i].l;
        int qr = q[i].r;
        int qid = q[i].id;

        if (id[ql] == id[qr]){
            ans[qid] = solve(ql, qr);

            continue;
        }

        if (id[l] != id[ql]){
            l = blocks[id[ql]].r;
            r = blocks[id[ql]].r;

            cnt.clear();
            res = -1;

            add(l);
        }

//        printf("ql=%d qr=%d\n", ql, qr);
        while (r < qr)
            add(++r);
        saveres = res;

        while (ql < l)
            add(--l);
        ans[qid] = res;

        for (int i = l; i < blocks[id[ql]].r; i++){
            cnt[a[i]]--;
        }
        l = blocks[id[ql]].r;
        res = saveres;
    }

    for (int i = 1; i <= Q; i++){
        printf("-%lld\n", ans[i]);
    }


    return 0;
}

2025/1/18 22:41
加载中...