垃圾马蜂分块WA40pts求助

P2801 教主的魔法

_TLEer_的小号 @ 2021-05-09 10:21:59

RT.

AC On 2,4,9,10,其他WA。

Code:

#include<iostream>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
int n,m,k,a[1000010],l,r,pos[1000010],cg[1000010],b[1000010];
char sz;
int blksz;
struct blk_T{
    int le,rt,tag;
    int erf(int k){
        return blksz-(lower_bound(b+le,b+rt+1,k-tag)-(b+le));
    }
}blk[10010];
int abr(int now){
    return pos[now];
}
bool ism(int x,int y){
    return abr(x)==abr(y);
}
void cgblk(int l,int r){
    for(int i=l;i<=r;i++)b[i]=a[i];
    sort(b+l,b+r+1);
}
void addblk(){
    blksz=sqrt(n);
    int blktot=0;
    for(int i=0;i<n;i++){
        pos[i]=blktot;
        b[i]=a[i];
        if(i>=(blktot+1)*blksz-1){
            blk[blktot].le=blktot*blksz;
            blk[blktot].rt=min(blk[blktot].le+blksz-1,n-1);
            // system("pause");
            blktot++;
            cgblk(blk[blktot].le,blk[blktot].rt);
        }
    }
    blk[blktot].le=blktot*blksz;
    blk[blktot].rt=min(blk[blktot].le+blksz-1,n-1);
    cgblk(blk[blktot].le,blk[blktot].rt);
//  cout<<blktot<<' '<<blk[blktot].le<<' '<<blk[blktot].rt<<endl;
}
void add(int le,int rt,int k){
    if(ism(le,rt)){
        for(int i=le;i<=rt;i++)
            a[i]+=k;
        cgblk(blk[abr(rt)].le,blk[abr(rt)].rt);
        return;
    }
    int lb=abr(le),rb=abr(rt);
    add(le,blk[lb].rt,k);
    add(blk[rb].le,rt,k);
    lb++;rb--;
    for(int i=lb;i<=rb;i++)
        blk[i].tag+=k;
}
int ask(int le,int rt,int k){
    int ans=0;
//  cout<<le<<' '<<rt<<' '<<ism(le,rt)<<endl;
    if(ism(le,rt)){
        for(int i=le;i<=rt;i++)
            if(a[i]+blk[abr(rt)].tag>=k)
                ans++;
        return ans;
    }
    int lb=abr(le),rb=abr(rt);
    ans+=ask(le,blk[lb].rt,k)+ask(blk[rb].le,rt,k);
    lb++;rb--;
    for(int i=lb;i<=rb;i++)
        ans+=blk[i].erf(k);
    return ans;
}
signed main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>a[i];
    addblk();
    for(int i=0;i<m;i++){
        cin>>sz>>l>>r>>k;
        l--,r--;
        if(sz=='M'){
            add(l,r,k);
        }
        else{
            cout<<ask(l,r,k)<<endl;
        }
    }
    return 0;
}

by syf1201 @ 2021-05-14 21:09:40

百万级别读入你给我来个cin?


by syf1201 @ 2021-05-14 21:19:27

lowerbound找不到就返回end

你这个要是找不到的话返回的end - begin好像比size小吧……

特判下块内是否存在大于等于w的数。


by syf1201 @ 2021-05-14 21:19:59

还有你这分块写得真是一言难尽……

我得我头疼……


by _TLEer_的小号 @ 2021-05-15 10:06:14

@祈愿救济者 感激不尽!

还有请问您所说的特判下块内是否存在大于等于w的数。是在哪里特判,特判什么呢?


by syf1201 @ 2021-05-16 21:42:44

@_TLEer_的小号

for(int i=lb;i<=rb;i++)

        ans+=blk[i].erf(k);

这里加上一个判断,右端点是否比k高


|