zero needs help!
查看原帖
zero needs help!
592781
zsz0804_楼主2024/11/7 20:28

大佬们,样例输出 8 5 4。

本人代码丑陋。

#include<bits/stdc++.h>
#define int long long
#define N 1000010
using namespace std;
int a[N],tree[4*N],tag[4*N],n,m,op,x,y,k;
int ls(int p){return p>>1;}
int rs(int p){return p>>1|1;}
void update(int p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(int p,int pl,int pr){
	if(pl==pr){
		tree[p]=a[pl];
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
}
void tagd(int pl,int pr,int p){
	int mid=(pl+pr)>>1;
	if(tag[p]>0){
		tag[ls(p)]=tag[rs(p)]=tag[p];
		tree[ls(p)]=(mid-pl+1)*tag[p];
		tree[rs(p)]=(pr-mid)*tag[p];
		tag[p]=0;
	}
}
int que2(int l,int r,int pl,int pr,int p){
	if(l<=pl&&pr<=r){
		return tree[p];
	}
	tagd(pl,pr,p); 
	int mid=(pl+pr)>>1,ans=0;
	if(l<=mid){
		ans+=que2(l,r,pl,mid,ls(p));
	}
	if(mid<r){
		ans+=que2(l,r,mid+1,pr,rs(p));
	}
	return ans;
}
void ch2(int i,int v,int pl,int pr,int p){
	if(pl==pr){
		tree[p]=v;
		return;
	}
	tagd(pl,pr,p);
	int mid=(pl+pr)>>1;
	if(i<=mid){
		ch2(i,v,pl,mid,ls(p));
	}else{
		ch2(i,v,mid+1,pr,rs(p));
	}
	update(p);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
	}
	build(1,1,n);
	while(m--){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			update(k);
		}else{
			cout<<que2(x,y,1,n,1)<<"\n";
		}
	}
	return 0;
}

AC回关

2024/11/7 20:28
加载中...