社区讨论

我的代码有什么问题啊,一直调不出来

P7706「Wdsr-2.7」文文的摄影布置参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi1vd3vz
此快照首次捕获于
2025/11/16 23:27
4 个月前
此快照最后确认于
2025/11/17 09:09
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+7;
const int INF=1e18;
int A[N],B[N];
struct segTree{
	int ijk;
	int ij,jk,k,j;
}T[4*N];
segTree merge(const segTree &l,const segTree &r){
	segTree temp;
	temp.k=max(l.k,r.k);
	temp.j=min(l.j,r.j);
	temp.ij=max({l.ij,r.ij,l.k-r.j});
	temp.jk=max({l.jk,r.jk,r.k-l.j});
	temp.ijk=max({l.ijk,r.ijk,l.ij+r.k,l.k+r.jk});
	return temp;
}
void build(int l,int r,int cnt){
	if(l==r){
		T[cnt].k=A[l];
		T[cnt].j=B[l];
		T[cnt].ij=-INF;
		T[cnt].ijk=-INF;
		T[cnt].jk=-INF;
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,cnt*2);
	build(mid+1,r,cnt*2+1);
	T[cnt]=merge(T[cnt*2],T[cnt*2+1]);
} 
void add1(int l,int r,int cnt,int pos,int val){
	if(l==r) {
		T[cnt].k=val;
		return ;
	}
	int mid=(l+r)/2;
	if(pos<=mid){
		add1(l,mid,cnt*2,pos,val);
	}else add1(mid+1,r,cnt*2+1,pos,val);
	T[cnt]=merge(T[cnt*2],T[cnt*2+1]);
}
void add2(int l,int r,int cnt,int pos,int val){
	if(l==r) {
		T[cnt].j=val;
		return ;
	}
	int mid=(l+r)/2;
	if(pos<=mid){
		add2(l,mid,cnt*2,pos,val);
	}else add2(mid+1,r,cnt*2+1,pos,val);
	T[cnt]=merge(T[cnt*2],T[cnt*2+1]);
}
segTree query(int l,int r,int cnt,int L,int R){
	if(L<=l&&r<=R) return T[cnt];
	int mid=(l+r)/2;
	if(R<=mid) return query(l,mid,cnt,L,R);
	if(L>mid) return query(mid+1,r,cnt,L,R);
	segTree left=query(l,mid,cnt,L,R);
	segTree right=query(mid+1,r,cnt,L,R);
	return merge(left,right);
}
int n,m;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>A[i];
	for(int i=1;i<=n;i++) cin>>B[i]; 
	build(1,n,1);
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			add1(1,n,1,x,y);
		}else if(op==2){
			add2(1,n,1,x,y);
		}else{
			segTree ans=query(1,n,1,x,y);
			cout<<ans.ijk<<"\n"; 
		}
	}
	return 0;
}

回复

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

正在加载回复...