10pts求调
查看原帖
10pts求调
1025097
koukou楼主2025/7/15 20:43

rt,只过了#1和#17

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 1;
int B, L, R, last;
int n, m, a[N], ans[N], tmp[N];
struct node
{
    int id;
    int l, r;
}q[N];
unordered_map<int,int> mp;
int first[N], last_pos[N];
bool cmp(node x, node y)
{
    if(x.l / B != y.l / B) return x.l < y.l;
    return x.r < y.r;
}
void lsh()
{
    memcpy(tmp, a, sizeof(a));
    sort(tmp + 1, tmp + n + 1);
    int cnt = unique(tmp + 1, tmp + n + 1) - tmp - 1;
    for(int i = 1; i <= cnt; i++)
        mp[tmp[i]] = i;
    for(int i = 1; i <= n; i++)
        a[i] = mp[a[i]];
    return;
}
signed main() 
{
    cin >> n;
    B = sqrt(n);
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    lsh();
    cin >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> q[i].l >> q[i].r;
        q[i].id = i;
    }
    sort(q + 1, q + m + 1, cmp);
    L = 1, R = 0, last = -1;
    for(int i = 1; i <= m; i++)
    {
        if(q[i].l / B == q[i].r / B)
        {
            int res = 0;
            for(int j = q[i].l; j <= q[i].r; j++)
            {
                if(!first[a[j]]) first[a[j]] = j;
                else res = max(res, j - first[a[j]]);
            }
            ans[q[i].id] = res;
            for(int j = q[i].l; j <= q[i].r; j++)
                first[a[j]] = 0;
        }
        else
        {
            if(last != q[i].l / B)
            {
                memset(first, 0, sizeof(first));
                memset(last_pos, 0, sizeof(last_pos));
                L = (q[i].l / B + 1) * B;
                R = L - 1;
                last = q[i].l / B;
            }
            while(R < q[i].r)
            {
                R++;
                if(!first[a[R]]) first[a[R]] = R;
                last_pos[a[R]] = R;
            }
            int cnt = 0;
            for(int j = q[i].l; j <= L - 1; j++)
            {
                if(!first[a[j]]) first[a[j]] = j;
                cnt = max(cnt, last_pos[a[j]] - j);
            }
            ans[q[i].id] = max(cnt, 0LL);
            for(int j = q[i].l; j <= L - 1; j++)
                first[a[j]] = 0;
        }
    }
    for(int i = 1; i <= m; i++)
        cout << ans[i] << "\n";
    return 0;
}
2025/7/15 20:43
加载中...