社区讨论

40分TLE求调

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mm1o3nfl
此快照首次捕获于
2026/02/25 14:42
上周
此快照最后确认于
2026/02/26 19:40
上周
查看原帖
请大佬指出问题
CPP
#include <bits/stdc++.h>
using namespace std;
#define N 1000100
#define ls(x) ((x)<<1)
#define rs(x) (((x)<<1)|1)
#define max(x,y) ((x>y) ? x:y)

struct node
{
	int l,r,mid;
	long long Max;
	long long add=0,ch=0;
}tr[N*4];
int a[N];
int n;

inline void up(int p)
{
	tr[p].Max=max(tr[ls(p)].Max,tr[rs(p)].Max);
}

inline void down(int p)
{
	if(tr[p].ch!=LONG_LONG_MAX)
	{
		tr[ls(p)].ch=tr[rs(p)].ch=tr[p].ch;
		tr[ls(p)].Max=tr[rs(p)].Max=tr[p].ch;
		tr[ls(p)].add=tr[rs(p)].add=0;
		tr[p].ch=LONG_LONG_MAX;
	}
	if(tr[p].add!=0)
	{
		tr[ls(p)].add+=tr[p].add;
		tr[rs(p)].add+=tr[p].add;
		tr[ls(p)].Max+=tr[p].add;
		tr[rs(p)].Max+=tr[p].add;
		tr[p].add=0;
	}
}

inline void build(int p,int ll,int rr)
{
	tr[p].l=ll;
	tr[p].r=rr;
	tr[p].mid=ll+(rr-ll)/2;
	tr[p].ch=LONG_LONG_MAX;
	tr[p].add=0;
	if(ll==rr)
	{
		tr[p].Max=a[ll];
		return;
	}
	int m=tr[p].mid;
	build(ls(p),ll,m);
	build(rs(p),m+1,rr);
	up(p);
}

inline long long ask(int p,int ll,int rr)
{
	int l=tr[p].l;
	int r=tr[p].r;
	if(ll<=l && r<=rr)
	{
		return tr[p].Max;
	}
	down(p);
	int m=tr[p].mid;
	long long res=LONG_LONG_MIN;
	if(ll<=m)
	{
		res=max(res,ask(ls(p),ll,rr));
	}
	if(rr>m)
	{
		res=max(res,ask(rs(p),ll,rr));
	}
	return res;
}

inline void pig1(int p,int ll,int rr,int k)//不要管这个函数名
{
	int l=tr[p].l;
	int r=tr[p].r;
	if(l>=ll && r<=rr)
	{
		tr[p].Max=k;
		tr[p].add=0;
		tr[p].ch=k;
		return;
	}
	down(p);
	int m=tr[p].mid;
	if(ll<=m)
	{
		pig1(ls(p),ll,rr,k);
	}
	if(rr>m)
	{
		pig1(rs(p),ll,rr,k);
	}
	up(p);
}

inline void pig2(int p,int ll,int rr,int k) 
{
	int l=tr[p].l;
	int r=tr[p].r;
	if(l>=ll && r<=rr)
	{
		tr[p].Max+=k;
		tr[p].add+=k;
		return;
	}
	down(p);
	int m=tr[p].mid;
	if(ll<=m)
	{
		pig2(ls(p),ll,rr,k);
	}
	if(rr>m)
	{
		pig2(rs(p),ll,rr,k);
	}
	up(p);
}

inline void test()
{
	int op,l,r,x;
	cin>>op;
	if(op==1)
	{
		cin>>l>>r>>x;
		pig1(1,l,r,x);
	}
	else if(op==2)
	{
		cin>>l>>r>>x;
		pig2(1,l,r,x);
	}
	else
	{
		cin>>l>>r;
		cout<<ask(1,l,r)<<'\n';
	}
}

inline void slove()
{
	int q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	while(q--)
	{
		test();
	}    
}

signed main()
{
	ios_base::sync_with_stdio(false);	
    cin.tie(0);
	cout.tie(0);
    slove();
    return 0;
}

回复

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

正在加载回复...