分块,20pts,我瞎了,求助
查看原帖
分块,20pts,我瞎了,求助
352464
JJA_楼主2021/5/15 22:08
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define DE puts("check");
int n,m;
int a[MAXN],s[MAXN];
int tag[MAXN],pos[MAXN];
int L[MAXN],R[MAXN];
int sz,tot;
void Inti(){
	sz=sqrt(n);
	while(++tot){
		L[tot]=R[tot-1]+1;
		R[tot]=min(sz*tot,n);
		forr(i,L[tot],R[tot]){
			pos[i]=tot,s[tot]+=a[i];
		}
		if(R[tot]==n){
			break;
		}
	}
}
void add(int x,int y,int val){
	int l=pos[x],r=pos[y];
	if(l==r){
		forr(i,x,y){
			a[i]+=val,s[l]+=val;
		}
	}
	else{
		forr(i,x,R[l]){
			a[i]+=val,s[l]+=val;
		}
		forr(i,l+1,r-1){
			tag[i]+=val,s[i]+=val*(R[i]=L[i]+1);
		}
		forr(i,L[r],y){
			a[i]+=val,s[r]+=val;
		}
	}
}
int sum(int x,int y){
	int l=pos[x],r=pos[y];
	int ans=0;
	if(l==r){
		forr(i,x,y){
			ans+=a[i]+tag[l];
		}
	}
	else{
		forr(i,x,R[l]){
			ans+=a[i]+tag[l];
		}
		forr(i,l+1,r-1){
			ans+=s[i];
		}
		forr(i,L[r],y){
			ans+=a[i]+tag[r];
		}
	}
	return ans;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	forr(i,1,n){
		scanf("%lld",&a[i]);
	}
	Inti();
	forr(i,1,m){
		int opt,x,y,val;
		scanf("%lld%lld%lld",&opt,&x,&y);
		if(!(opt%2)){
			printf("%lld\n",sum(x,y));
		}
		else{
			scanf("%lld",&val);
			add(x,y,val);
		}
	}
}

image.png

所以可能是哪里出了问题

2021/5/15 22:08
加载中...