样例没过但AC求调
查看原帖
样例没过但AC求调
555065
ChrysanthBlossom楼主2024/3/26 20:12

rt

感觉非常神奇

#include<bits/stdc++.h>
#define ri register int 
#define ll unsigned long long 
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
int n,m;
int belong[maxn];
int bl[maxn],br[maxn];
ll a[maxn];
ll sum[maxn];
int siz;
ll tag[2003][2003];
ll calc_bg(int l,int r){
	ll ans=0;
	if(r-l<=siz*2){
		for(ri i=l;i<=r;i++){
			ans=ans+a[i];
		}
		return ans;
	}
	for(ri i=l;i<=br[belong[l]];i++)ans=ans+a[i];
	for(ri i=bl[belong[r]];i<=r;i++)ans=ans+a[i];
	for(ri i=belong[l]+1;i<=belong[r]-1;i++){
		ans=ans+sum[i];
	}
	return ans;
}
ll calc_sm(int p,int len){
	return tag[len][n/siz+1]*(p/len)+tag[len][p%len];
}
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline void write(int a){
    if(a<0) putchar('-'),a=-a;
    if(a>=10)write(a/10);
    putchar(a%10+48);
}
signed main(){
	n=read();
	m=read();
	for(ri i=1;i<=n;i++){
		a[i]=read();
	}
	siz=sqrt(n)/4;
	for(ri i=1;i<=n;i++){
		if(i<=siz)belong[i]=1;
		else belong[i]=belong[i-siz]+1;
	}
	memset(bl,0x3f,sizeof(bl));
	for(ri i=1;i<=n;i++){
		bl[belong[i]]=min(bl[belong[i]],i);
		br[belong[i]]=max(br[belong[i]],i);
		sum[belong[i]]+=a[i];
	}
	for(ri i=1;i<=m;i++){
		int op,x,y,z;
		op=read();
		if(op==1){
			y=read();
			x=read();
			z=read();
			if(y>siz){
				for(ri p=x;p<=n;p+=y){
					a[p]=a[p]+z;
					sum[belong[p]]=sum[belong[p]]+z;
				}
			}
			else{
				for(ri p=x;p<=n/siz+1;p++){
					tag[y][p]=tag[y][p]+z;
				}
			}
		}
		else{
			x=read();
			y=read();
			ll ans=calc_bg(x,y);
			for(ri i=1;i<=siz;i++){
				ans=ans+calc_sm(y,i);
				ans=ans-calc_sm(x-1,i);
			}
			write(ans%mod);
			putchar('\n');
		}
	}
	return 0;
}
2024/3/26 20:12
加载中...