情况是这样子的:
我写的P1253的代码中被 @kkswk 加入了过量的 43 号混凝土导致 CE 于是我不得不继续加入更多的意大利菠萝披萨和锂电池来防止 TLE 结果就 WA 了 8 个点 求助awa
算法是线段树
#include<bits/stdc++.h>
#define int long long
#define maxn 1000010
using namespace std;
int n,q;
int a[maxn];
struct node{
int l,r,maxx;
int tag1,tag2;//对应加/修改
}tree[4*maxn];
void build(int id,int l,int r){
tree[id].l=l;
tree[id].r=r;
if(l==r){
tree[id].maxx=a[l];
tree[id].tag1=0;
tree[id].tag2=-20110208;
return ;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].maxx=max(tree[id*2].maxx,tree[id*2+1].maxx);
return ;
}
void tag2_down(int id){
if(tree[id].tag2!=-20110208){
tree[id*2].tag1=tree[id*2+1].tag1=0;
tree[id*2].maxx=tree[id*2+1].maxx=tree[id].tag2;
tree[id*2].tag2=tree[id].tag2;
tree[id*2+1].tag2=tree[id].tag2;
tree[id].tag2=-20110208;
}
}
void tag1_down(int id){
if(tree[id].tag1!=0){
tag2_down(id);
tree[id*2].maxx+=tree[id].tag1;
tree[id*2+1].maxx+=tree[id].tag1;
tree[id*2].tag1+=tree[id].tag1;
tree[id*2+1].tag1+=tree[id].tag1;
tree[id].tag1=0;
}
}
void push_down(int id){
tag2_down(id);
tag1_down(id);
}
int query(int id,int l,int r){
if(tree[id].l>=l&&tree[id].r<=r){
return tree[id].maxx;
}
push_down(id);
int res=-1e9;
if(tree[id*2].r>=l){
res=max(res,query(id*2,l,r));
}
if(tree[id*2+1].l<=r){
res=max(res,query(id*2+1,l,r));
}
return res;
}
void add(int id,int l,int r,int c){
if(tree[id].l>=l&&tree[id].r<=r){
tag2_down(id);
tree[id].maxx+=c;
tree[id].tag1+=c;
return ;
}
push_down(id);
if(tree[id*2].r>=l){
add(id*2,l,r,c);
}
if(tree[id*2+1].l<=r){
add(id*2+1,l,r,c);
}
tree[id].maxx=max(tree[id*2].maxx,tree[id*2+1].maxx);
return ;
}
void change(int id,int l,int r,int c){
if(tree[id].l>=l&&tree[id].r<=r){
tree[id].maxx=c;
tree[id].tag1=0;
tree[id].tag2=c;
return ;
}
push_down(id);
if(tree[id*2].r>=l){
change(id*2,l,r,c);
}
if(tree[id*2+1].l<=r){
change(id*2+1,l,r,c);
}
tree[id].maxx=max(tree[id*2].maxx,tree[id*2+1].maxx);
return ;
}
signed main(){
std::ios::sync_with_stdio(false);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=q;i++){
int op,x,y,z;
cin>>op>>x>>y;
if(op==1){
cin>>z;
change(1,x,y,z);
}
else if(op==2){
cin>>z;
add(1,x,y,z);
}
else{
cout<<query(1,x,y)<<'\n';
}
}
return 0;
}
关于:意大利菠萝披萨是什么梗可以自行BDFS