社区讨论

wa 7~10!!!求调!!!

P1253扶苏的问题参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@ltip4e0f
此快照首次捕获于
2024/03/08 21:32
2 年前
此快照最后确认于
2024/03/09 07:42
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=5e6,INF=114514520606060606;
ll T[N],la1[N],la2[N];
ll n,m;
inline ll read()
{
    ll x=0,f=1; char ch=getchar();
    while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
    while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
inline ll ma (ll a,ll b)
{
	return (a>=b)?a:b;
}
void build (ll i,ll l,ll r,ll k,ll x)
{
	if (l==r) {
		T[i]=x;
		return ;
	}
	ll mid=(l+r)>>1;
	if (k<=mid) build(i<<1,l,mid,k,x);
	else build(i<<1|1,mid+1,r,k,x);
	T[i]=ma(T[i<<1],T[i<<1|1]); 
}
void push_down (ll i)
{
	if (la1[i]!=INF) {
		la1[i<<1]=la1[i<<1|1]=la1[i];
		la2[i<<1]=la2[i<<1|1]=0;
		T[i<<1]=T[i<<1|1]=la1[i];
		la1[i]=INF;
	}
	if (la2[i]!=0) {
		la2[i<<1]+=la2[i];
		la2[i<<1|1]+=la2[i];
		T[i<<1]+=la2[i];
		T[i<<1|1]+=la2[i];
		la2[i]=0;
	}
} 
void change (ll i,ll l,ll r,ll L,ll R,ll x,ll f)
{
	if (L<=l && r<=R) {
		if (f==1) {
			T[i]=x;
			la1[i]=x;
		}
		else {
			T[i]+=x;
			la2[i]+=x;
		}
		push_down(i);
		return ;
	} 
	push_down(i);
	ll mid=(l+r)>>1;
	if (L<=mid) change(i<<1,l,mid,L,R,x,f);
	if (R>mid) change(i<<1|1,mid+1,r,L,R,x,f);
	T[i]=ma(T[i<<1],T[i<<1|1]);
} 
ll query (ll i,ll l,ll r,ll L,ll R)
{
	if (L<=l && r<=R) return T[i];
	push_down(i);
	ll mid=(l+r)>>1,x1=-INF,x2=-INF;
	if (L<=mid) x1=query(i<<1,l,mid,L,R);
	if (R>mid) x2=query(i<<1|1,mid+1,r,L,R);
//	T[i]=ma(T[i<<1],T[i<<1|1]);
	return ma(x1,x2);
}
int main()
{
	freopen("P1253_7.in","r",stdin);
//	cout<<INF;
	n=read(); m=read();
	for (ll i=0;i<=5*n;i++) la1[i]=INF;
	for (ll i=1;i<=n;i++) {
		ll a=read();
		build(1,1,n,i,a);
	}
	for (ll i=1;i<=m;i++) {
		ll f=read(),l=read(),r=read(),x=0;
		if (f==1 || f==2) {
			x=read();
			change(1,1,n,l,r,x,f);
		}
		else printf("%lld\n",query(1,1,n,l,r));
	}
//	for (ll i=1;i<=n*2;i++) cout<<T[i]<<" ";
//	cout<<endl; 
//	for (ll i=1;i<=n*2;i++) cout<<la1[i]<<" ";
//	cout<<endl; 
//	for (ll i=1;i<=n*2;i++) cout<<la2[i]<<" ";
//	cout<<endl; 
	return 0;
}
/*
4 4
10 4 -3 -7
1 1 3 0
2 3 4 -4
1 2 4 -9
3 1 4
*/

回复

1 条回复,欢迎继续交流。

正在加载回复...