分块0pts求助
查看原帖
分块0pts求助
356003
Moeebius楼主2021/12/11 19:56

忽略longlong的问题,连样例都没过……

#include<bits/stdc++.h>
using namespace std;
int belong[100001];
int tag[100001];
int st[100001];
int ed[100001];
int a[100001];
int sum[100001];
int n,m,len;

void init()
{
	int cnt=n/len;
	if(n%len) cnt++;
	for(int i=1; i<=cnt; i++) 
		st[cnt]=(i-1)*len+1,ed[cnt]=i*len;
	for(int i=1; i<=n; i++)
		belong[i]=(i-1)/len+1;
	for(int i=1; i<=n; i++)
		sum[belong[i]]+=a[i];
}
void add(int l, int r, long long v)
{
	int x=belong[l],y=belong[r];
	if(x==y)
	{
        for(int i=st[x]; i<=ed[x]; i++) a[i]+=tag[x];
        sum[x]+=tag[x]*len;	
        tag[x]=0;
		for(int i=l; i<=r; i++) a[i]+=v;
		sum[x]+=(r-l+1)*v;
		return;
	}
	for(int i=st[x]; i<=ed[x]; i++) a[i]+=tag[x];
	sum[x]+=tag[x]*len;
	tag[x]=0;
	for(int i=l; i<=ed[x]; i++) a[i]+=v;
	sum[x]+=(ed[x]-l+1)*v;
	for(int i=x+1; i<=y-1; i++) tag[i]+=v;
	for(int i=st[y]; i<=ed[y]; i++) a[i]+=tag[y];
	sum[y]+=tag[y]*len;
	tag[y]=0;
	for(int i=st[y]; i<=r; i++) a[i]+=v;
	sum[y]+=(r-st[y]+1)*v;
}

long long query(int l, int r)
{
	long long res=0;
	int x=belong[l],y=belong[r];
	if(x==y)
	{
		for(int i=l; i<=r; i++) res+=a[i];
		res+=(r-l+1)*tag[x];
		return res;
	}
	for(int i=l; i<=ed[x]; i++) res+=a[i]+tag[x];
	for(int i=x+1; i<=y-1; i++) res+=sum[i]+tag[i]*len;
	for(int i=st[y]; i<=r; i++) res+=a[i]+tag[y];
	return res;
}

int main()
{

	scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);
	len=sqrt(n);
	init();
	for(int i=1; i<=m; i++)
	{
	
    	int op,l,r,v;
    	scanf("%d%d%d",&op,&l,&r);
    	if(op==1)
    	{
    		scanf("%d",&v);
    		add(l,r,v);
    	}
    	else
    	{
    		printf("%lld\n",query(l,r));
    	}
	}
	return 0;
}
2021/12/11 19:56
加载中...