求助!半绿半红

P2801 教主的魔法

WTR2007 @ 2021-07-22 17:44:41

#include<bits/stdc++.h>
using namespace std;
inline long long int read(){
    int f=1;
    long long int w=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        w=(w<<1)+(w<<3)+(ch-48);
        ch=getchar();
    }
    return w*f;
}
long long int a[1010050],b[1010050],c,d[1015],l,l1,r1,r;
void check1(char cnt){
    if(cnt=='M'){
        for(int i=l;i<=r;i++){
            a[i]+=c;
        }
        l1=1000*(l/1000);
        l=1000*(l/1000+1)-1;
        sort(b+l1,b+l);
    }
    else{
        int ans=0,x=l/1000+1;
        for(int i=l;i<=r;i++){
            if(a[i]+d[x]>=c) ans++;
        }
        cout<<ans<<endl;
    }
}
void check2(char cnt){
    int l1=1000*(l/1000+1)-1,r1=(r/1000)*1000;
    if(cnt=='M'){
        for(int i=l;i<=l1;i++){
            a[i]+=c;
        }
        sort(b+(l/1000)*1000,b+l1);
        for(int i=r1;i<=r;i++){
            a[i]+=c;
        }
        sort(b+r1,b+(r/1000+1)*1000-1);
        for(int i=l/1000+2;i<=r/1000;i++) d[i]+=c;
    }
    else{
        int x=l/1000+1;
        long long int ans=0;
        for(int i=l;i<=l1;i++){
            if(a[i]+d[x]>=c) ans++; 
        }
        int y=r/1000+1;
        for(int i=r1;i<=r;i++){
            if(a[i]+d[y]>=c) ans++;
        }
        for(int i=x+1;i<y;i++){
            int c1=c-d[i],e=(i-1)*1000,k=i*1000-1;
            if(e==0) e++;
            for(int j=e;j<=k;j++){
                if(a[j]>=c1){
                    ans=ans+i*1000-j+1;
                    break;
                }
            }
        }
        cout<<ans<<endl;
    }
}
int main(){
    long long int n,q,k,t;
    n=read();q=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        b[i]=a[i];
    }
    for(int i=1;i<=n/1000+1;i++){
        if(i>1) sort(b+1000*(i-1),b+1000*i-1);
        else sort(b+1,b+999);
    }
    char tmp;
    for(int i=1;i<=q;i++){
        cin>>tmp;
        l=read();r=read();c=read();
        if(l/1000==r/1000) check1(tmp);
        else check2(tmp);
    }
    return 0;
}

by sogk @ 2021-07-22 17:45:31

二分


by 违规用户名gAGt8$%z @ 2021-07-22 17:45:58

二 分 啊


|