求助,wa50

P2801 教主的魔法

ezoiHY @ 2019-01-27 20:30:42

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

int n,m,bel[1001],blb[1001],ble[1001],num[1001];
long long tag[1001],a[1000001],blok[1001][1001];

int query(int l,int r,long long w){
    int bl=bel[l];
    int br=bel[r];
    int ret=0;
    for(int i=bl+1;i<br;i++){
        ret+=num[i]-(lower_bound(blok[i]+1,blok[i]+num[i]+1,w-tag[i])-blok[i])+1;
    }
    if(bl!=br){
        if(l==blb[bl]){
            ret+=num[bl]-(lower_bound(blok[bl]+1,blok[bl]+num[bl]+1,w-tag[bl])-blok[bl])+1;
        }else {
            for(int i=l;i<=ble[bl];i++){
                if(a[i]>=w-tag[bl])ret++;
            }
        }
        if(r==ble[br]){
            ret+=num[br]-(lower_bound(blok[br]+1,blok[br]+num[br]+1,w-tag[br])-blok[bl])+1;
        }else {
            for(int i=blb[br];i<=r;i++){
                if(a[i]>=w-tag[bl])ret++;
            }
        }
    }else {
        for(int i=l;i<=r;i++){
            if(a[i]>=w-tag[bl])ret++;
        }
    }
    return ret;
}

void add(int l,int r,long long w){
    int bl=bel[l];
    int br=bel[r];
    for(int i=bl+1;i<br;i++){
        tag[i]+=w;
    }
    if(bl!=br){
        if(l==blb[bl]){
            tag[bl]+=w;
        }else {
            for(int i=l;i<=ble[bl];i++){
                a[i]+=w;
            }
            for(int i=blb[bl];i<=ble[bl];i++){
                blok[bl][i-blb[bl]+1]=a[i];
            }
            sort(blok[bl]+1,blok[bl]+num[bl]+1);
        }
        if(r==ble[br]){
            tag[br]+=w;
        }else {
            for(int i=blb[br];i<=r;i++){
                a[i]+=w;
            }
            for(int i=blb[br];i<=ble[br];i++){
                blok[br][i-blb[br]+1]=a[i];
            }
            sort(blok[br]+1,blok[br]+num[br]+1);
        }
    }else {
        for(int i=l;i<=r;i++){
            a[i]+=w;
        }
        for(int i=blb[br];i<=ble[br];i++){
            blok[br][i-blb[br]+1]=a[i];
        }
        sort(blok[br]+1,blok[br]+num[br]+1);
    }

}

int main(){
    scanf("%d%d",&n,&m);
    int gg=sqrt(n),cnt=0,tmp=0;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        if(i%gg==1){
            cnt++;
            tmp=0;
            ble[cnt-1]=i-1;
            blb[cnt]=i;
        }
        blok[cnt][++tmp]=a[i];
        num[cnt]++;
        bel[i]=cnt;
    }
    for(int i=1;i<=cnt;i++){
        sort(blok[i]+1,blok[i]+num[i]+1);
    }
    while(m--){
        char opt[3];
        scanf("%s",opt);
        if(opt[0]=='A'){
            int l,r;long long w;
            scanf("%d%d%lld",&l,&r,&w);
            printf("%d\n",query(l,r,w));
        }else {
            int l,r;long long w;
            scanf("%d%d%lld",&l,&r,&w);
            add(l,r,w);
        }
    }
    return 0;
}

by GMSD @ 2019-10-09 14:24:32

我也是,不知道哪里错了,自测数据是对的


|