分块WA求助
查看原帖
分块WA求助
200044
JS_TZ_ZHR楼主2020/8/22 15:47

RT

#include<bits/stdc++.h>
#define int long long
#define begin gsdgfdsa
#define end fgdsgfsakjl
using namespace std;
int n,m,block,begin[1000005],end[1000005];
long long lazy[1000005],a[1000005];
struct node {
    int p;
    long long num;
    bool operator<(const node &a)const {
        return a.num>num;
    }
} s[1000005],t1[1000005],t2[1000005];
void build() {
    block=sqrt(n);
    int num=1;
    for(int i=1; i<=n; i+=block) {
        begin[num]=i,end[num]=min(n,i+block-1);
        sort(s+i,s+end[num]+1);
        num++;
    }
    return;
}
inline int query(int k) {
    int num=(n/block)+(n%block!=0),ans1=1,ans2=0;
    node nk;
    nk.num=k;
    for(int i=1; i<=num; i++) {
        nk.num-=lazy[i];
        int p=lower_bound(s+begin[i],s+end[i]+1,nk)-s;
        if(s[p].num+lazy[i]==k&&p>=begin[i]&&p<=end[i]) {
            for(int j=begin[i]; j<=end[i]; j++) {
                if(a[j]+lazy[i]==k) {
                    ans1=j;
                    break;
                }
            }
            break;
        }
        nk.num+=lazy[i];
    }
    for(int i=num; i>=1; i--) {
        nk.num-=lazy[i];
        int p=lower_bound(s+begin[i],s+end[i]+1,nk)-s;
        if(s[p].num+lazy[i]==k&&p>=begin[i]&&p<=end[i]) {
            for(int j=end[i]; j>=begin[i]; j--) {
                if(a[j]+lazy[i]==k) {
                    ans2=j;
                    break;
                }
            }
            break;
        }
        nk.num+=lazy[i];
    }
    return ans2-ans1;
}
void msort(int end1,int end2,int start) {
    int cnt1=1,cnt2=1;
    for(register int i=start; i<start+end1+end2; i++) {
        if((t1[cnt1].num<t2[cnt2].num&&cnt1<=end1)||cnt2>end2)
            s[i]=t1[cnt1++];
        else s[i]=t2[cnt2++];
    }
}
inline void update(int l,int r,int k) {
    int numl=(l/block)+(l%block!=0);
    int numr=(r/block)+(r%block!=0);
    int num1=0,num2=0;
    if(numl==numr) {
        if(l==begin[numl]&&r==end[numl])lazy[numl]+=k;
        else {
            for(int i=l; i<=r; i++)a[i]+=k;
            for(register int i=begin[numl]; i<=end[numl]; i++) {
                a[i]+=lazy[numl];
                s[i].num+=lazy[numl];
                if(s[i].p>=l&&s[i].p<=r)s[i].num+=k,t1[++num1]=s[i];
                else t2[++num2]=s[i];
            }
            msort(num1,num2,begin[numl]);
            lazy[numl]=0;
        }
        return;
    }
    for(register int i=l; i<=end[numl]; i++)a[i]+=k;
    for(register int i=begin[numr]; i<=r; i++)a[i]+=k;
    for(register int i=begin[numl]; i<=end[numl]; i++) {
        a[i]+=lazy[numl];
        s[i].num+=lazy[numl];
        if(s[i].p>=l)s[i].num+=k,t1[++num1]=s[i];
        else t2[++num2]=s[i];
    }
    msort(num1,num2,begin[numl]);
    num1=num2=0;
    for(register int i=begin[numr]; i<=end[numr]; i++) {
        a[i]+=lazy[numr];
        s[i].num+=lazy[numr];
        if(s[i].p<=r)s[i].num+=k,t1[++num1]=s[i];
        else t2[++num2]=s[i];
    }
    msort(num1,num2,begin[numr]);
    lazy[numl]=lazy[numr]=0;
    for(int i=numl+1; i<numr; i++)lazy[i]+=k;
}
signed main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1; i<=n; i++)scanf("%lld",&a[i]),s[i].p=i,s[i].num=a[i];
    build();
    int opt,x,y,z;
    while(m--) {
        scanf("%lld%lld",&opt,&x);
        if(opt==2)
            printf("%lld\n",query(x));
        else scanf("%lld%lld",&y,&z),update(x,y,z);
    }
}
2020/8/22 15:47
加载中...