本人分块模块化,可读性高,在线求调

P2801 教主的魔法

LBYYSM_123 @ 2023-07-20 13:48:35


#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q;
int a[1000001],bel[1000001];
int st[1001],ed[1001],mark[1001];
vector<int> d[1001];
void build(){
    q=sqrt(n);
    for(int i=1;i<=q;i++)
        st[i]=n/q*(i-1)+1,ed[i]=n/q*i;ed[q]=n;
    for(int i=1;i<=q;i++){
        for(int j=st[i];j<=ed[i];j++)
            bel[j]=i,d[i].push_back(a[j]);
    }
    for(int i=1;i<=q;i++)
        sort(d[i].begin(),d[i].end());
}
void reset(int x){
    while(d[x].empty()!=0) d[x].pop_back();
    for(int i=st[x];i<=ed[x];i++)
        d[x].push_back(a[i]);
    sort(d[x].begin(),d[x].end());
}
void add(int l,int r,int k){
    if(bel[l]==bel[r]){
        for(int i=l;i<=r;i++)
            a[i]+=k;
        reset(bel[l]);
    }
    else{
        for(int i=l;i<=ed[bel[l]];i++)
            a[i]+=k;
        reset(bel[l]);
        for(int i=st[bel[r]];i<=r;i++)
            a[i]+=k;
        reset(bel[r]);
        for(int i=bel[l]+1;i<bel[r];i++)
            mark[i]+=k;
    }
}
int ask(int l,int r,int k){
    int ans=0;
    if(bel[l]==bel[r]){
        for(int i=l;i<=r;i++)
            if(a[i]+mark[bel[l]]>=k)
                ans++;
        return ans;
    }
    else{
        for(int i=l;i<=ed[bel[l]];i++)
            if(a[i]+mark[bel[l]]>=k)
                ans++;
        for(int i=st[bel[r]];i<=r;i++)
            if(a[i]+mark[bel[r]]>=k)
                ans++;
        for(int i=bel[l]+1;i<bel[r];i++){
            int x=k-mark[i];           
            ans+=lower_bound(d[i].begin(),d[i].end(),x)-d[i].begin();
        }
        return ans;
    }
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)   
        cin>>a[i];
    build();
    for(int i=1;i<=m;i++){
        char c;int x,y,z;
        cin>>c>>x>>y>>z;
        if(c=='M') add(x,y,z);
        else cout<<ask(x,y,z)<<endl;
    }
    return 0;
}```

by LBYYSM_123 @ 2023-07-20 13:55:43

只有 20 分,求求大家了


by H3PO4 @ 2023-07-20 14:22:24

@LBYYSM_123 ans+=lower_bound(d[i].begin(),d[i].end(),x)-d[i].begin();

->

ans+=d[i].end()-lower_bound(d[i].begin(),d[i].end(),x);


by H3PO4 @ 2023-07-20 14:28:15

@LBYYSM_123 还有这题不用开 long long


by LBYYSM_123 @ 2023-07-20 14:39:44

@H3PO4 谢谢您的好意,除此之外还要把代码中的while(d[x].empty()!=0) d[x].pop_back();改成d[x].clear(),警示后人,此贴结。


|