奇异写法求助
查看原帖
奇异写法求助
824941
bsjsaikou10楼主2023/11/12 00:10
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<climits>
using namespace std;
const int MAXN = 1e6 + 6;
typedef struct Line{
    int l,r,id;
}Line;
bool cmp(Line x,Line y){
    return x.r < y.r;
}
int c[MAXN],a[MAXN],pre[MAXN],last[MAXN],ans[MAXN];
Line line[MAXN];
int n,m;
int lowbit(int x){
    return x & -x;
}
void add(int pos,int v){
    for(int i = pos; i <= n; i += lowbit(i)){
        c[i] += v;
    }
}
int query(int pos){
    int res = 0;
    for(int i = pos; i; i -= lowbit(i)){
        res += c[i];
    }
    return res;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    for(int i = 1; i <= n; i++){
        pre[a[i]] = last[a[i]];
        last[a[i]] = i;
    }
    cin >> m;
    for(int i = 1; i <= m; i++){
        int l,r;
        cin >> l >> r;
        line[i].l = l - 1;
        line[i].r = r;
        line[i].id = i;
    }
    sort(line + 1,line + 1 + m,cmp);
    int pos = 1;
    for(int i = 1; i <= m; i++){
        while(pre[a[pos]] <= line[i].l + 1 && pos <= line[i].r){
            add(pos,1);
            if(pre[a[pos]]){
                add(pre[a[pos]],-1);
            }
            pos++;
        }
        ans[line[i].id] = query(line[i].r) - query(line[i].l);
    }
    for(int i = 1; i <= m; i++){
        cout << ans[i] << endl;
    }
}

2023/11/12 00:10
加载中...