RE#3#4求助

P2801 教主的魔法

CyberPrisoner @ 2023-02-05 13:33:31

#include<bits/stdc++.h>
using namespace std; 
const int N=1e6+10;
int n,q,tot;
int id[N],len;
int a[N],b[N],c[N],L[N],R[N];
void add(int l,int r,int x){
    int sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            a[i]+=x;
        }
        for(int i=L[sid];i<=R[sid];i++){
            c[i]=a[i];
        }
        sort(c+L[sid],c+R[sid]+1);
        return;
    }
    for(int i=l;id[i]==sid;i++)
        a[i]+=x;
    for(int i=L[sid];i<=R[sid];i++)
        c[i]=a[i];
    sort(c+L[sid],c+R[sid]+1);
    for(int i=r;id[i]==eid;i--)
        a[i]+=x;
    for(int i=L[eid];i<=R[eid];i++)
        c[i]=a[i];
    sort(c+L[eid],c+R[eid]+1);
    for(int i=sid+1;i<eid;i++){
        b[i]+=x;
    }
}
int query(int l,int r,int x){
    int ans=0;
    int sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            if(a[i]+b[sid]>=x)ans++;
        }
        return ans;
    }
    for(int i=l;i<=R[sid];i++){
        if(a[i]+b[sid]>=x)ans++;
    }
    for(int i=r;i>=L[eid];i--){
        if(a[i]+b[eid]>=x)ans++;
    }
    for(int i=sid+1;i<eid;i++){
        if(c[L[i]]+b[i]>=x){
            ans+=len;
            continue;
        }
        int res=lower_bound(c+L[i],c+R[i]+1,x-b[i])-c-L[i];
        //cout<<res<<endl;
        ans+=R[i]-L[i]+1-res;
    }
    return ans;
}
int main(){
    cin>>n>>q;
    tot=len=sqrt(n);
    if(len*len!=n)tot++;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        c[i]=a[i];
        id[i]=(i-1)/len+1;
        if(id[i]!=id[i-1])
        L[id[i]]=i;
        if(i/len+1!=id[i]){
            R[id[i]]=i;
        }
    }
    R[tot]=n;
    for(int i=1;i<=tot;i++)
    sort(c+L[i],c+R[i]+1);
    for(int i=1;i<=q;i++){
        char op;
        int l,r,w;
        cin>>op;
        cin>>l>>r>>w;
        if(op=='M'){    
            add(l,r,w);
        }
        if(op=='A'){
            cout<<query(l,r,w)<<endl; 
        }
    }
    return 0;
}

by CyberPrisoner @ 2023-10-30 18:40:50

已重构代码,此贴结


|