10pts,AC on #1,求调
查看原帖
10pts,AC on #1,求调
1125242
zenith_once楼主2025/7/18 20:15

有WA有TLE。

#include<bits/stdc++.h>
#define LL long long
#define int LL
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dow(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
LL read()
{
    LL x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
	{
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
	{
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
void write(LL x)
{
    if(x<0)
	{
        putchar('-');
        x=-x;
    }
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

#define pl p<<1
#define pr p<<1|1
const int N=2e5+1,INF=LONG_LONG_MAX;
int v[N],n,m;
struct T{int l,r,lazy,Min,v;} a[N<<2];
void pushup(int p)
{
	if(a[p].l==a[p].r) return;
	a[p].Min=min(a[pr].Min,a[pl].Min),
	a[p].v=a[pl].v+a[pr].v;
}
void down(int p)
{
	if(!a[p].lazy) return; 
	if(a[p].l==a[p].r){a[p].Min+=a[p].lazy,a[p].v+=a[p].lazy,a[p].lazy=0;return;}
 	a[pl].lazy+=a[p].lazy,
	a[pr].lazy+=a[p].lazy,
	a[pl].Min+=a[pl].lazy,
	a[pr].Min+=a[pr].lazy,
	a[pl].v+=a[pl].lazy*(a[pl].r-a[pl].l+1),
	a[pr].v+=a[pr].lazy*(a[pr].r-a[pr].l+1),
	a[p].lazy=0;
}
void Build(int l,int r,int p)
{
	a[p]={l,r,0};
	if(l==r) {a[p].Min=a[p].v=v[l];return;}
	int mid=l+r>>1;
	Build(l,mid,pl);
	Build(mid+1,r,pr);
	pushup(p);
}
void update(int l,int r,int v,int p)
{
	if(l<=a[p].l&&a[p].r<=r) {a[p].lazy+=v;}
	down(p);
	if(a[p].l==a[p].r) return;
	if(a[pr].l<=r) update(l,r,v,pr);
	if(a[pl].r>=l) update(l,r,v,pl);
	pushup(p);
}
int query_Min(int l,int r,int p)
{
	pushup(p);
	int ans=INF;
	if(a[p].lazy) down(p);
	if(l<=a[p].l&&a[p].r<=r) {return a[p].Min;}
	if(a[p].l==a[p].r) return a[p].Min;
	if(a[pr].l<=r) ans=query_Min(l,r,pr);
	if(a[pl].r>=l) ans=min(ans,query_Min(l,r,pl));
	return ans;
}
int query_v(int l,int r,int p)
{
	pushup(p);
	if(a[p].lazy) down(p);
	if(l<=a[p].l&&a[p].r<=r) {return a[p].v;}
	int ans=0;
	if(a[p].l==a[p].r) return a[p].v;
	if(a[pr].l<=r) ans+=query_v(l,r,pr);
	if(a[pl].r>=l) ans+=query_v(l,r,pl);
	return ans;
}
signed main()
//int main()
{
	n=read(),m=read();
	rep(i,1,n) v[i]=read();
	Build(1,n,1);
	
	
	char rt;
	int aa,b,c;
	while(m--)
	{
		cin>>rt;aa=read(),b=read();
		if(rt=='M') write(query_Min(aa,b,1)),puts("");
		if(rt=='P') c=read(),update(aa,b,c,1);
		if(rt=='S') write(query_v(aa,b,1)),puts("");
	}
	
	//for(int i=1;i<=7;i++) cout<<i<<" "<<a[i].l<<" "<<a[i].r<<" "<<a[i].Min<<" "<<a[i].v<<" "<<a[i].lazy<<endl;
	return 0;
}
2025/7/18 20:15
加载中...