第一次学习块块球跳
  • 板块灌水区
  • 楼主cmpt_xiaoxiao
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/22 16:30
  • 上次更新2024/10/22 18:57:49
查看原帖
第一次学习块块球跳
954694
cmpt_xiaoxiao楼主2024/10/22 16:30

problem

code:

#include<iostream>
#include<cmath>
using namespace std;
int len,id[1000001];
//len=块长 id=第i位对应的块编号 
int a[1000001],b[1000001],s[10000001];
//a数组,b标记,s区和 
int n,q;
void pl(int l,int r,int x){
	int lid=id[l];
	int rid=id[r];
	if(lid==rid){
		for(int i=l;i<=r;i++){
			a[i]+=x;
			s[id[i]]+=x;
		}
	}
	for(int i=l;id[i]==lid;i++){
		a[i]+=x;
		s[id[i]]+=x;
	}
	for(int i=lid+1;i<rid;i++){
		b[i]+=x;
		s[i]+=x*len;
	}
	for(int i=r;id[i]==rid;i--){
		a[i]+=x;
		s[id[i]]+=x;
	}
}
int qu(int l,int r){
	int lid=id[l];
	int rid=id[r];
	int ans=0;
	if(lid==rid){
		for(int i=l;i<=r;i++) ans+=(a[i]+b[i]);
		return ans;
	}
	for(int i=l;id[i]==lid;i++) ans+=(a[i]+b[i]);
	for(int i=lid+1;i<rid;i++) ans+=s[i];
	for(int i=r;id[i]==rid;i--) ans+=(a[i]+b[i]);
	return ans;
}
int main(){
	cin>>n>>q;
	int len=sqrt(n);
	int cnt=0;
	int sum=1;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(cnt==len) cnt=0,sum++;
		cnt++;
		id[i]=sum;
		s[id[i]]+=a[i];
	}
	/*for(int i=1;i<=n;i++){
		cout<<id[i]<<" ";
	}
	cout<<endl;
	int debug=0;*/
	while(q--){
		int op;
		cin>>op;
		if(op==1){
			int l,r,x;
			cin>>l>>r>>x;
			pl(l,r,x);
			/*cout<<"debug step "<<++debug<<":";
			for(int i=1;i<=n;i++) cout<<a[i]<<" ";
			cout<<endl;*/
		}else{
			int l,r;
			cin>>l>>r;
			cout<<qu(l,r)<<endl;
		}
	}
	return 0;
}
2024/10/22 16:30
加载中...