【悬赏关注】RE on #9 88pts 求助
查看原帖
【悬赏关注】RE on #9 88pts 求助
539211
lzyqwq楼主2023/2/27 20:03

树状数组套权值线段树,不知为何 RE。空间难道不是 O(nlogn)\mathcal{O}(n\log n) 的吗

#include<bits/stdc++.h>
#define N 200001
using namespace std;
int n,m,a[N],la[N],pos[N],ans1[N],ans2[N],lmt;
struct query{
    int l,a,b,id;
};
vector<query>g[N];
struct bit_sgt{
    int cnt,sgt[N*40],bit[N],ls[N*40],rs[N*40];
    void clear(){
        cnt=0;
        memset(bit,0,sizeof bit);
        memset(sgt,0,sizeof sgt);
        memset(ls,0,sizeof ls);
        memset(rs,0,sizeof rs);
    }
    void sgt_up(int x){
        sgt[x]=0;
        if(ls[x]){
            sgt[x]+=sgt[ls[x]];
        }
        if(rs[x]){
            sgt[x]+=sgt[rs[x]];
        }
    }
    void sgt_mdf(int&x,int l,int r,int k,int v){
        if(l>r){
            return;
        }
        if(!x){
            x=++cnt;
        }
        if(l^r){
            int mid=(l+r)>>1;
            if(k<=mid){
                sgt_mdf(ls[x],l,mid,k,v);
            }else{
                sgt_mdf(rs[x],mid+1,r,k,v);
            }
            sgt_up(x);
        }else{
            sgt[x]+=v;
        }
    }
    int sgt_qry(int x,int l,int r,int ql,int qr){
        if(!x||l>r||ql>qr){
            return 0;
        }
        if(ql<=l&&r<=qr){
            return sgt[x];
        }
        int mid=(l+r)>>1,ret=0;
        if(ql<=mid){
            ret+=sgt_qry(ls[x],l,mid,ql,qr);
        }
        if(qr>mid){
            ret+=sgt_qry(rs[x],mid+1,r,ql,qr);
        }
        return ret;
    }
    void bit_mdf(int x,int k,int v){
        if(x<1||x>n){
            return;
        }
        for(int i=x;i<=n;i+=i&-i){
            sgt_mdf(bit[i],1,lmt,k,v);
        }
    }
    int bit_qry(int l,int r,int ql,int qr){
        if(l>r){
            return 0;
        }
        int ret=0;
        for(int i=r;i;i-=i&-i){
            ret+=sgt_qry(bit[i],1,lmt,ql,qr);
        }
        for(int i=l-1;i;i-=i&-i){
            ret-=sgt_qry(bit[i],1,lmt,ql,qr);
        }
        return ret;
    }
}t;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        la[i]=pos[a[i]];
        pos[a[i]]=i;
    }
    t.clear();
    lmt=*max_element(a+1,a+1+n);
    for(int i=1,l,r,x,y;i<=m;++i){
        scanf("%d%d%d%d",&l,&r,&x,&y);
        g[r].push_back({l,x,y,i});
    }
    for(int i=1;i<=n;++i){
        t.bit_mdf(i,a[i],1);
        for(auto j:g[i]){
            ans1[j.id]=t.bit_qry(j.l,i,j.a,j.b);
        }
    }
    t.clear();
    for(int i=1;i<=n;++i){
        t.bit_mdf(la[i],a[i],1);
        for(auto j:g[i]){
            ans2[j.id]=ans1[j.id]-t.bit_qry(j.l,i,j.a,j.b);
        }
    }
    for(int i=1;i<=m;++i){
        printf("%d %d\n",ans1[i],ans2[i]);
    }
}
2023/2/27 20:03
加载中...