蒟蒻分块全WA,悬关求调
查看原帖
蒟蒻分块全WA,悬关求调
1112575
with_my_moon楼主2024/10/21 21:03
#include <bits/stdc++.h>
using namespace std;
//O(玄学)//who cares? 
#define maxn 1008611

int n,q,w;
int a[maxn];
int k[maxn];
int lz_ta[maxn];

int read(){
	int x=0,f=1;
	char cn=getchar();
	while(cn<'0'||cn>'9'){
		if(cn=='-') f=1;
		cin>>cn;
		cn=getchar();
	}
	while(cn>='0'&&cn<='9') x=x*10+cn-'0',cn=getchar();return x*f;
}

void out(int a){
	if(a/10) out(a/10);
	putchar(a%10+'0');
}

int main(){
	n=read();
	q=read();
	w=read();
	int cw=w;
	int knum=sqrt(n);
	int zk=n-knum*knum;
	for(int i=1;i<=n;++i) a[i]=read();
	//cout<<knum<<endl;
	for(int i=1;i<=knum+1;++i){
		for(int j=(i-1)*knum+1;j<=min(i*knum,n);j++){
			k[i]+=a[j];
		}
	}//初始化块
	//for(int i=1;i<=knum+1;i++) cout<<k[i]<<" ";cout<<endl;
	for(int i=1;i<=q;++i){//knum
        //when used the number in the a[],plus the lazy tag
        w=cw;
        int l,r,d;
        l=read();
        r=read();
        d=read();
        l--;
        r--;
        int cnl=l/knum;
        int cnr=r/knum;
        if(l%knum!=0){
            for(int j=l+1;j<=(cnl+1)*knum;++j)
                a[j]+=d,k[cnl+1]+=d;
        }
        if(r%knum!=knum-1){
            for(int j=cnr*knum+1;j<=r+1;++j)
                a[j]+=d,k[cnr+1]+=d;
        }
        for(int j=cnl+1;j<=cnr;j++) lz_ta[j]+=d*knum;
        //for(int j=1;j<=n;j++) cout<<a[j]<<" ";cout<<endl;
        //for(int j=1;j<=knum+1;j++) cout<<k[j]<<" ";cout<<endl;
        //for(int j=1;j<=knum+1;j++) cout<<lz_ta[j]<<" ";cout<<endl;
        //标记和修改
        int ans=0;
        int djk=1;
        int bs=1;
        int flag=0;
        while(w>0){
            if(w-(k[djk]+lz_ta[djk])*bs<=0){
                for(int j=(djk-1)*knum+1;j<=djk*knum;++j){
                    w-=(a[j]+lz_ta[djk]/knum)*bs;
                    //cout<<"w:"<<w<<endl;
                    if(w<=0){
                        out(ans);
                        putchar('\n');
                        flag=1;
                        break;
                    }
                    ans++;
                }
            }//如果这个块打死了
            if(flag==1) break;
			w-=(k[djk]+lz_ta[djk])*bs;
            //cout<<k[djk]*bs<<" "<<w<<endl;
            if(djk==knum+1){
                bs*=2;
                djk=1;
                ans+=n-knum*knum;
            }
            else{
                ans+=knum;++djk;
            }//打并且翻倍
        }
	}
	return 0;
}
2024/10/21 21:03
加载中...