社区讨论
我的代码有什么问题啊,一直调不出来
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 条回复,欢迎继续交流。
正在加载回复...