(线段树1)求条!!!玄关
查看原帖
(线段树1)求条!!!玄关
1446545
XHZnewlife楼主2025/1/22 15:05
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int num;
	int lid,rid;
	int left,right;
	int lan;
};
tree leaf[1000005];int cnt=0;
int a[100005];int n,m;
inline int build(int l,int r){
	leaf[++cnt]={0,0,0,l,r,0};
	int id=cnt;
	if(l==r){leaf[id].num=a[l];return id;}
	int mid=l+r>>1;
	leaf[id].lid=build(l,mid);
	leaf[id].rid=build(mid+1,r);
	leaf[id].num=leaf[leaf[id].rid].num+leaf[leaf[id].lid].num;
	return id;
}
inline int read(int x,int y,int id){
	int ans=0;
	if(leaf[id].left>=x and leaf[id].right<=y){
		ans+=leaf[id].num;
		if(leaf[id].lan){
			if(leaf[id].left!=leaf[id].right){
				leaf[leaf[id].lid].lan+=leaf[id].lan;
				leaf[leaf[id].rid].lan+=leaf[id].lan;
			}
			leaf[id].lan=0;
		}
		return ans;
	}
	int mid=leaf[id].left+leaf[id].right>>1;
	if(x<=mid)ans+=read(x,y,leaf[id].lid);
	if(y>mid)ans+=read(x,y,leaf[id].rid);
	return ans;
}
inline void update(int x,int y,int c,int id){
	if(x<=leaf[id].left and y>=leaf[id].right){
		leaf[id].lan+=c;
		leaf[id].num+=(leaf[id].right-leaf[id].left+1)*leaf[id].lan;
		return;
	}
	if(leaf[id].lan and leaf[id].left!=leaf[id].right){
		leaf[leaf[id].lid].lan+=leaf[id].lan;
		leaf[leaf[id].rid].lan+=leaf[id].lan;
		leaf[id].lan=0;
	}
	int mid=leaf[id].left+leaf[id].right>>1;
	if(x<=mid)update(x,y,c,leaf[id].lid);
	if(y>mid)update(x,y,c,leaf[id].rid);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}build(1,n);
	for(int i=1,t,x,y,k;i<=m;i++){
		cin>>t>>x>>y;
		if(t==1){
			cin>>k;
			update(x,y,k,1);
		}
		else if(t==2){
			cout<<read(x,y,1)<<endl;
		}
	}
	return 0;
}

样例也过不去 (前两问正确,最后一问输出12)

2025/1/22 15:05
加载中...