社区讨论
后6点TLE求调,玄关,马蜂良好
P1253扶苏的问题参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi5udgf4
- 此快照首次捕获于
- 2025/11/19 18:10 4 个月前
- 此快照最后确认于
- 2025/11/21 00:01 4 个月前
马蜂良好,但并不能解决tle问题:(
新学线段树
CPP#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define max(WJ,XXG) WJ>=XXG?WJ:XXG
#define min(WJ,XXG) WJ<=XXG?WJ:XXG
using namespace std;
const int N=1e6+10;
const int inf=-1145141919810;
struct Tree{
int l,r,tag,tagg,ans;
}t[N<<2];
int n,q,a[N];
char op;
inline void maxx(int i){t[i].ans=max(t[i<<1].ans,t[i<<1|1].ans);}
inline void build(int l,int r,int i){
t[i].l=l;t[i].r=r;
t[i].tagg=inf;
t[i].tag=0;
t[i].ans=0;
if(l==r){
t[i].ans=a[l];
return;
}int mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
maxx(i);
}void spread(int i){
if(t[i].tagg!=inf){
t[i<<1].tagg=t[i].tagg;
t[i<<1].ans=t[i].tagg;
t[i<<1|1].ans=t[i].tagg;
t[i<<1|1].tagg=t[i].tagg;
t[i].tagg=inf;
t[i<<1].tag=0;
t[i<<1|1].tag=0;
}if(t[i].tag){
t[i<<1].ans+=t[i].tag;
t[i<<1|1].ans+=t[i].tag;
t[i<<1].tag+=t[i].tag;
t[i<<1|1].tag+=t[i].tag;
t[i].tag=0;
}
}void change(int l,int r,int i,int x){
if(l<=t[i].l&&t[i].r<=r){
t[i].tag+=x;
t[i].ans+=x;
return;
}spread(i);
int mid=(t[i].l+t[i].r)>>1;
if(l<=mid) change(l,r,i<<1,x);
if(r>mid) change(l,r,i<<1|1,x);
maxx(i);
}void cchange(int l,int r,int i,int x){
if(l<=t[i].l&&t[i].r<=r){
t[i].tag=0;
t[i].ans=x;
t[i].tagg=x;
return;
}spread(i);
int mid=(t[i].l+t[i].r)>>1;
if(l<=mid) cchange(l,r,i<<1,x);
if(r>mid) cchange(l,r,i<<1|1,x);
maxx(i);
}int ask(int l,int r,int i){
if(l<=t[i].l&&t[i].r<=r)
return t[i].ans;
spread(i);
int mid=(t[i].l+t[i].r)>>1,cnt=inf;
if(l<=mid) cnt=max(cnt,ask(l,r,i<<1));
if(r>mid) cnt=max(cnt,ask(l,r,i<<1|1));
return cnt;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
while(q--){
cin>>op;
int l,r,x;
cin>>l>>r;
if(op=='1'){
cin>>x;
cchange(l,r,1,x);
}else if(op=='2'){
cin>>x;
change(l,r,1,x);
}else
cout<<ask(l,r,1)<<endl;
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...