萌新40分求助

P2801 教主的魔法

Liyuqiao11 @ 2023-02-08 17:32:31

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
#define int long long
vector<int> v[N];
int n,q,id[N],len,b[N],a[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++){
            for(int j=0;j<v[sid].size();j++){
                if(a[i]==v[sid][j]){
                    v[sid][j]+=x;
                    break;
                }
            }
            a[i]+=x;
        }
        sort(v[sid].begin(),v[sid].end(),greater<int>());
        return;
    }
    for(int i=l;id[i]==sid;i++){
        for(int j=0;j<v[sid].size();j++){
            if(a[i]==v[sid][j]){
                v[sid][j]+=x;
                break;
            }
        }
        a[i]+=x;
    }
    for(int i=sid+1;i<eid;i++){
        b[i]+=x;
    }
    for(int i=r;id[i]==eid;i--){
        for(int j=0;j<v[eid].size();j++){
            if(a[i]==v[eid][j]){
                v[eid][j]+=x;
                break;
            }
        }
        a[i]+=x;
    }
    sort(v[sid].begin(),v[sid].end(),greater<int>());
    sort(v[eid].begin(),v[eid].end(),greater<int>());
}
int query(int l,int r,int c){
    int ans=0,sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            if(a[i]+b[id[i]]>=c){
                ans++;
            }
        }
        return ans;
    }
    for(int i=l;id[i]==sid;i++){
        if(a[i]+b[id[i]]>=c){
            ans++;
        }
    }
    for(int i=sid+1;i<eid;i++){
        ans+=v[i].end()-lower_bound(v[i].begin(),v[i].end(),c-b[i]);
    }
    for(int i=r;id[i]==eid;i--){
        if(a[i]+b[id[i]]>=c){
            ans++;
        }
    }
    return ans;
}
signed main(){
    cin>>n>>q;
    len=sqrt(n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        id[i]=(i-1)/len+1;
        v[id[i]].push_back(a[i]);
    }
    for(int i=1;i<=q;i++){
        char op;
        int l,r,x,c;
        cin>>op;
        if(op=='M'){
            cin>>l>>r>>x;
            add(l,r,x);
        }
        if(op=='A'){
            cin>>l>>r>>c;
            cout<<query(l,r,c)<<endl;
        }
    }
    return 0;
}

by Liyuqiao11 @ 2023-02-08 22:32:49

此贴结,我把排序排成降序了,以及我一开始没排序qwq


|