代码加入过量的43号混凝土致WA求助
  • 板块灌水区
  • 楼主__Q_w_Q__
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/6 20:07
  • 上次更新2024/8/6 21:07:53
查看原帖
代码加入过量的43号混凝土致WA求助
933380
__Q_w_Q__楼主2024/8/6 20:07

情况是这样子的:

我写的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

2024/8/6 20:07
加载中...