求助,30分
查看原帖
求助,30分
1127126
yueyan_WZF楼主2024/8/17 18:04
#include<bits/stdc++.h>
#define int long long
#define Max(a,b) max(a,b)
#define Min(a,b) min(a,b)
using namespace std;
typedef long long ll;
const int N=200100;
struct node{
	int l,r,lazy;
	int sum,minn;
}z[N*4];

int a[N]; 
int n,m;
inline void pushdown(int k){
	if(z[k].lazy){
		z[k*2].sum+=1ll*(z[k*2].r-z[k*2].l+1)*z[k].lazy;
		z[k*2+1].sum+=1ll*(z[k*2+1].r-z[k*2+1].l+1)*z[k].lazy;
		z[k*2].minn+=z[k].lazy;
		z[k*2+1].minn+=z[k].lazy;
		z[k*2].lazy+=z[k].lazy;
		z[k*2+1].lazy+=z[k].lazy;
		z[k].lazy=0;
	}
}
inline void build(int l,int r,int k){
	z[k].l=l;
	z[k].r=r;
	z[k].lazy=0;
	z[k].minn=0x3f3f3f3f;
	if(l==r){
		z[k].sum=a[l];
		z[k].minn=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	z[k].sum=z[k*2].sum+z[k*2+1].sum;
	z[k].minn=Min(z[k*2].minn,z[k*2+1].minn);
}
inline int minn(int l,int r,int k){
	if(z[k].l==z[k].r){
		return z[k].minn;
	}
	pushdown(k);
	int mid=z[k].r+z[k].l>>1;
	int minnn=0x3f3f3f3f3f;
	if(l<=mid){
		minnn=Min(minnn,minn(l,r,k*2)); 
	}
	if(r>mid){
		minnn=Min(minnn,minn(l,r,k*2+1));
	}
	return minnn;
}
inline int summ(int l,int r,int k){
	if(z[k].l>=l&&z[k].r<=r){
		return z[k].sum;
	}
	pushdown(k);
	int ans=0;
	int mid=z[k].l+z[k].r>>1;
	if(l<=mid){
		ans+=summ(l,r,k*2);
	}
	if(r>mid){
		ans+=summ(l,r,k*2+1);
	}
	return ans;
}
inline void chan(int l,int r,int k,int v){
	if(z[k].l>=l&&z[k].r<=r){
		z[k].minn+=v;
		z[k].sum+=1ll*(z[k].r-z[k].l+1)*v;
		z[k].lazy+=v;
		return ;
	}
	pushdown(k);
	int mid=z[k].l+z[k].r>>1;
	if(l<=mid){
		chan(l,r,k*2,v);
	}
	if(r>mid){
		chan(l,r,k*2+1,v);
	}
	z[k].sum=z[k*2].sum+z[k*2+1].sum;
	z[k].minn=Min(z[k*2].minn,z[k*2+1].minn);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	//	cout<<i<<endl;
	}
	build(1,n,1);
	for(int i=1;i<=m;i++){
		char opt;
		cin>>opt;
		if(opt=='P'){
			int l,r,z;
			scanf("%lld%lld%lld",&l,&r,&z);
			chan(l,r,1,z);
		}
		if(opt=='M'){
			int l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",minn(l,r,1));
		}
		if(opt=='S'){
			int l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",summ(l,r,1));
		}
	//	cout<<i<<" "<<m<<endl;
	}
}

其他全部TLE

2024/8/17 18:04
加载中...