社区讨论
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 条回复,欢迎继续交流。
正在加载回复...