萌新求助莫队做法
查看原帖
萌新求助莫队做法
398190
lanretE楼主2022/10/11 15:26

rt,看到这个题先去把 P2709 的做法改了一下交,但是一直都 WA,然后就直接贺了 P1972 的树状数组写法,然后过了,有没有神仙看一下我 WA 的代码哪里错了

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k; 
const int N=200010;
int a[N];
long long ans[N],num;
int len;
struct query{
    int l,r,id;
    bool operator <(const query &a)const{
        if((l-1)/len==(a.l-1)/len) return r<a.r;
        return l/len<a.l/len;
    }
}q[N];
int cnt[N];
void add(int x){++cnt[x]; if(cnt[x]==1) ++num;}
void del(int x){--cnt[x]; if(cnt[x]==0) --num;}
int main(){
    cin>>n;
    len=1;
    while(len*len<n) ++len;
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    cin>>m;
    for(int i=1;i<=m;++i){
        scanf("%d%d",&q[i].l,&q[i].r); q[i].id=i;
    }
    sort(q+1,q+m+1);
    int ll=1,rr=0;
    for(int i=1;i<=m;++i){
        int l=q[i].l,r=q[i].r;
        while(l<ll) --ll,add(a[ll]);
        while(r>rr) ++rr,add(a[rr]);
        while(l>ll) del(a[ll]),++ll;
        while(r<rr) del(a[rr]),--rr;
        ans[q[i].id]=num;
    }
    for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
    return 0;
}
2022/10/11 15:26
加载中...