蒟蒻求助,大佬们帮帮忙吧,分块,爆零了,有过样例,求求了
查看原帖
蒟蒻求助,大佬们帮帮忙吧,分块,爆零了,有过样例,求求了
268802
吾心无际涯楼主2022/7/7 11:27

一直找没找出问题,请大佬帮帮忙。 样例过了,调试了很久也没发现问题,到底WA在哪啊,哭。

(大佬们行行好,帮个忙,不行给个数据也好,感谢,感谢,万分感谢)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,len;
int id[200005];
long long sum[200005],num[200005],t[200005];
int read(){
	int a=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		a=(a<<1)+(a<<3)+(c-'0');
		c=getchar();
	}
	return f*a;
}
int main(){
	
	n=read(),m=read();
	len=sqrt(n);
	for(int i=1;i<=n;i++)
		id[i]=(i-1)/len+1;
	for(int i=1;i<=n;i++)
		num[i]=read();
	//输入,初始化 
	while(m--){
		int c=read();
		
		if(c==1){
			int l=read(),r=read();
			long long k=read();
			int a=id[l],b=id[r];
			if(a==b){
				for(int i=l;i<=r;i++){
					num[i]+=k;
					sum[i]+=k;
				}
			}
			else {
				for(int i=l;id[i]==a;i++){
					num[i]+=k;
					sum[a]+=k;
				}
				for(int i=a+1;i<b;i++){
					sum[i]+=k*len;
					t[i]+=k;
				}
				for(int i=r;id[i]==b;i--){
					num[i]+=k;
					sum[b]+=k;
				}
			}
		}
		
		else if(c==2){
			long long k=read();
			num[1]+=k;
			sum[id[1]]+=k;
		}
		
		else if(c==3){
			long long k=read();
			num[1]-=k;
			sum[id[1]]-=k;
		}
		
		else if(c==4){
			int l=read(),r=read();
			long long ans=0;
			int a=id[l],b=id[r];
			if(a==b){
				for(int i=l;i<=r;i++)
					ans+=num[i]+t[id[i]];
			}
			else {
				for(int i=l;id[i]==a;i++)
					ans+=num[i]+t[id[i]];
				for(int i=a+1;i<b;i++)
					ans+=sum[i];
				for(int i=r;id[i]==b;i--)
					ans+=num[i]+t[id[i]];
			}
			printf("%lld\n",ans);
		}
		
		else printf("%lld\n",num[1]);
	}
	return 0;
}
2022/7/7 11:27
加载中...