求条(样例都不对)
查看原帖
求条(样例都不对)
1272489
jintongxuan楼主2024/11/28 19:50
#include<bits/stdc++.h>
#define int long long
#define fff(i,l,r) for(int i=l;i<=r;i++)
#define ddd(i,l,r) for(int i=l;i>=r;i--)
#define pb push_back
#define mk make_pair
using namespace std;
const int N=1e5+5;
int a[N];
int n;
struct SegmentTree{
	int seg[N*4],tag[N*4];
	void pushdown(int p,int l,int r){
		int mid=(l+r)/2;
		int x=tag[p];
		tag[p]=0;
		tag[p*2]+=x;
		tag[p*2+1]+=x;
		seg[p*2]+=x*(mid-l+1);
		seg[p*2+1]+=x*(r-mid);
	}
	void build(int l,int r,int p,int a[]){
		if(l==r){
			seg[p]=a[r];
			return;
		}
		int mid=(l+r)/2;
		build(l,mid,p*2,a);
		build(mid+1,r,p*2+1,a);
		seg[p]=seg[p*2]+seg[p*2+1];
	}
	void update(int l,int r,int s,int t,int p,int c){
		if(l<=s&&t<=r){
			seg[p]+=c*(r-l+1);
			tag[p]+=c;
			return;
		}
		int mid=(l+r)/2;
		if(tag[p]!=0){
			pushdown(p,l,r);
		}
		if(mid>=s)update(l,mid,s,t,p*2,c);
		if(mid<t)update(mid+1,r,s,t,p*2+1,c);
		seg[p]=seg[p*2]+seg[p*2+1];
	}
	int query(int l,int r,int s,int t,int p){
		if(l<=s&&t<=r)return seg[p];            
		int mid=(l+r)/2;            
		if(tag[p]!=0){  
			pushdown(p,l,r);
		}
		int sum=0;
		if(mid>=s)sum+=query(l,mid,s,t,p*2);
		if(mid<t)sum+=query(mid+1,r,s,t,p*2+1);
		return sum;	                           
	}
}s1;
signed main(){
	int T;
	cin>>n>>T;
	fff(i,1,n)cin>>a[i];
	s1.build(1,n,1,a);
	while(T--){
		int op,x,y,k;
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			s1.update(1,n,x,y,1,k);
		}
		if(op==2)cout<<s1.query(1,n,x,y,1)<<'\n';
//		fff(i,1,n*4){
//			cout<<setw(3)<<i;
//		}
//		cout<<'\n';
//		fff(i,1,n*4){
//			cout<<setw(3)<<s1.seg[i];
//		}
//		cout<<'\n';
//		fff(i,1,n*4){
//			cout<<setw(3)<<s1.tag[i];
//		}
//		cout<<'\n';
	}
 	return 0;
}

第一遍写过了第二遍反而过不去了,就打算写一个struct封装,调不对了,服了,唐了呀

2024/11/28 19:50
加载中...