样例不过?
查看原帖
样例不过?
774677
iakioi114514楼主2025/1/23 21:50
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,f,block,t,add[1000001],op,l,r,c,a[1000001],s[1000001],e[1000001],pos[1000001],sum[1000001];
void init(){
	block=sqrt(n);
	t=n/block;
	if(n%block) t++;
	for(int i=1;i<=t;i++){
		s[i]=e[i-1]+1;
		e[i]=i*block;
	}
	e[t]=n;
	for(int i=1;i<=t;i++){
		for(int j=s[i];j<=e[i];j++){
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
}
void change1(int l,int r,int c){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			a[i]+=c;
			sum[p]+=c;
		}
	}
	else{
		for(int i=l;i<=e[p];i++){
			a[i]+=c;
			sum[p]+=c; 
		}
		for(int i=p+1;i<=q-1;i++){
			add[i]+=c;
		}
		for(int i=s[q];i<=r;i++){
			a[i]+=c;
			sum[q]+=c;
		}
	}
}
void change2(int c){
	a[1]+=c;
	sum[1]+=c;
}
void change3(int c){
	a[1]-=c;
	sum[1]-=c;
}
int query1(int l,int r){
	int p=pos[l],q=pos[r];
	int res=0;
	if(p==q){
		for(int i=l;i<=r;i++){
			res+=a[i];
			res+=add[p];
		}
	}
	else{
		for(int i=l;i<=e[p];i++){
			res+=a[i];
			res+=add[p];
		}
		for(int i=p+1;i<=q-1;i++){
			res+=sum[i]+add[i]*block;
		}
		for(int i=s[q];i<=r;i++){
			res+=a[i];
			res+=add[q];
		}
	}
	return res;
}
int query2(){
	return a[1]+add[1];
}
signed main(){
	cin>>n>>f;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	init();
	while(f--){
		cin>>op;
		if(op==1){
			cin>>l>>r>>c;
			change1(l,r,c);
		}
		if(op==2){
			cin>>c;
			change2(c);
		}
		if(op==3){
			cin>>c;
			change3(c);
		}
		if(op==4){
			cin>>l>>r;
			cout<<query1(l,c)<<endl;
		}
		if(op==5){
			cout<<query2()<<endl;
		}
		for(int i=1;i<=n;i++){
			cout<<a[i]+add[i]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

求各位大佬指点。

2025/1/23 21:50
加载中...