求调,悬关
  • 板块灌水区
  • 楼主un1i
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/29 14:51
  • 上次更新2024/12/29 16:04:33
查看原帖
求调,悬关
1115911
un1i楼主2024/12/29 14:51

题目

代码:

用的分块,不知道为啥过不了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100005;
int n,m,x,y,opt,w,k;
int a[maxn],l[maxn],r[maxn],pos[maxn],add[maxn],sum[maxn];
int tj(int x,int y){
	int p=pos[x],q=pos[y],ans=0;
	if(p==q){
		for(int i=x;i<=y;i++) ans+=a[i]+add[q];
		return ans;
	}
	for(int i=p+1;i<=q-1;i++){
		ans+=sum[i];
	}
	for(int i=x;i<=r[p];i++){
		ans+=a[i]+add[p];
	}
	for(int i=l[q];i<=y;i++){
		ans+=a[i]+add[q];
	}
	return ans;
}
void addm(int x,int y,int v){
	int p=pos[x],q=pos[y];
	if(p==q){
		for(int i=x;i<=y;i++) a[i]+=v;
		sum[p]+=(y-x+1)*v;
		return ;
	}
	for(int i=p+1;i<=q-1;i++){
		add[i]+=v;
		sum[i]+=(r[i]-l[i]+1)*v;
	}
	for(int i=x;i<=r[p];i++) a[i]+=v;
	sum[p]+=(r[p]-x+1)*v;
	for(int i=l[q];i<=y;i++) a[i]+=v;
	sum[q]+=(y-l[q]+1)*v;
	return ;
}
signed main(){
	cin>>n>>m;
	int t=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=t;i++){
		l[i]=(i-1)*t+1;r[i]=i*t;
		for(int j=l[i];j<=r[i];j++){
			pos[j]=i;
		}
	}
	if(r[t]<n){
		t++;
		l[t]=r[t-1]+1;r[t]=n;
		for(int i=l[t];i<=r[t];i++) pos[i]=t;
	}
	while(m--){
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>k;
			addm(x,y,k);
		}else{
			cout<<tj(x,y)<<endl;
		}
	}
	return 0;
}
2024/12/29 14:51
加载中...