树状数组+二维数点,只有40分
查看原帖
树状数组+二维数点,只有40分
291695
Horizon6楼主2021/8/31 23:41

是因为我自带大常数体质吗,太离谱了 求大佬康康

#include <bits/stdc++.h>

using namespace std;
const int N=1e6+5;
int n,m,cnt;
int a[N],pre[N],vis[N],ans[N];

struct Seg{
    int type,x,y,id;
    bool operator <(const Seg& w){
        return x<w.x;
    }
}e[N];
int c[N];

int lowbit(int x){
    return x&-x;
}

void add(int x) {
    for (++x; x<=n+1; x+=x&-x) ++c[x];
}

int query(int x) {
    int r = 0;
    for (++x; x; x^=x&-x) r+=c[x];
    return r;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    cin >>n;
    for(int i=1;i<=n;i++){
        cin >>a[i];
        pre[i]=vis[a[i]];
        vis[a[i]]=i;
    }

    cin >>m;
    for(int i=1;i<=m;i++){
        int l,r; cin >>l>>r;
        e[++cnt]={-1,l-1,l-1,i};
        e[++cnt]={1,r,l-1,i};
    }
    sort(e+1,e+cnt+1);
    int now=1;
    for(int i=1;i<=cnt;i++){
        while (now<=e[i].x) add(pre[now++]);
        ans[e[i].id]+=e[i].type*query(e[i].y);
    }
    for(int i=1;i<=m;i++){
        cout <<ans[i]<<endl;
    }
    return 0;
}
2021/8/31 23:41
加载中...