萌新刚学莫队,求助
查看原帖
萌新刚学莫队,求助
86973
花园Serena楼主2020/11/24 16:12

RT,不知道为什么TLE

附上代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define R register int
const int N = 2e6 + 10;
struct node {
    int l ,r, id, op;
}q[N];
LL Ans[N], a[N], cnt[N], ans = 0;
int n, m, k, size;
bool cmp (register node x,register node y) {
    return x.op != y.op ? x.l < y.l : ((x.op & 1) ? x.r < y.r : x.r > y.r);
}
void inline del (int x) {
    -- cnt[a[x]];
    if(!cnt[a[x]]) -- ans;
}
void inline add (int x) {
    if(!cnt[a[x]]) ++ ans;
    ++ cnt[a[x]];
}
int main ()  {
    scanf("%d", &n);
    size = (int) sqrt(n);
    if(size * size < n) size ++;
    for(R i = 1; i <= n; i ++)
        scanf("%lld", &a[i]);
    scanf("%d", &m);
    for(R i = 1; i <= m; i ++) {
        scanf("%d%d", &q[i].l, &q[i].r);
        q[i].id = i;  q[i].op = ((i - 1) / size + 1);
    }
    sort(q + 1, q + m + 1, cmp);
    int l = 1, r = 0;
    for(R i = 1; i <= m; i ++ ){
        while (l < q[i].l) del(l ++);
        while (l > q[i].l) add(-- l);
        while (r < q[i].r) add(++ r);
        while (r > q[i].r) del(r --);
        Ans[q[i].id] = ans; 
    }
    for(R i = 1; i <= m; i ++)
        printf("%lld\n", Ans[i]);
    return 0;
}
2020/11/24 16:12
加载中...