60pts线段树求hack/调,后四个点WA
查看原帖
60pts线段树求hack/调,后四个点WA
612567
Kazeno_Akina楼主2023/10/26 14:59

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const long long inf=LLONG_MAX;
struct node{
  int l,r;
  bool use;
  long long add_tag,change_tag,maxi=-inf;
};
int n,q,a[N];
node tr[N<<2];
void build(int p,int l,int r){
  tr[p].l=l,tr[p].r=r;
  if(l==r){
    tr[p].maxi=a[l];
    return;
  }
  int mid=l+r>>1;
  build(p<<1,l,mid),build(p<<1|1,mid+1,r);
  tr[p].maxi=max(tr[p<<1].maxi,tr[p<<1|1].maxi);
}
inline void pushdown(int p){
  if(tr[p].use){
    tr[p].use=0;
    tr[p<<1].change_tag=tr[p<<1|1].change_tag=tr[p].change_tag;
    tr[p<<1].add_tag+=tr[p].add_tag,tr[p<<1|1].add_tag+=tr[p].add_tag;
    tr[p<<1].maxi=tr[p<<1|1].maxi=tr[p].change_tag+tr[p].add_tag;
    tr[p].add_tag=0;
    return;
  }
  tr[p<<1].add_tag+=tr[p].add_tag,tr[p<<1|1].add_tag+=tr[p].add_tag;
  tr[p<<1].maxi+=tr[p].add_tag,tr[p<<1|1].maxi+=tr[p].add_tag;
  tr[p].add_tag=0;
  return;
}
void upd(int p,int l,int r,int num,int type){
  if(type==1){
    if(l<=tr[p].l&&tr[p].r<=r){
      tr[p].maxi=tr[p].change_tag=num,tr[p].add_tag=0,tr[p].use=1;
      return;
    }
    pushdown(p);
    int mid=tr[p].l+tr[p].r>>1;
    if(l<=mid) upd(p<<1,l,r,num,type);
    if(mid<r) upd(p<<1|1,l,r,num,type);
    tr[p].maxi=max(tr[p<<1].maxi,tr[p<<1|1].maxi);
    return;
  }
  if(l<=tr[p].l&&tr[p].r<=r){
    tr[p].maxi+=num,tr[p].add_tag+=num;
    return;
  }
  pushdown(p);
  int mid=tr[p].l+tr[p].r>>1;
  if(l<=mid) upd(p<<1,l,r,num,type);
  if(mid<r) upd(p<<1|1,l,r,num,type);
  tr[p].maxi=max(tr[p<<1].maxi,tr[p<<1|1].maxi);
  return;
}
long long query(int p,int l,int r){
  if(l<=tr[p].l&&tr[p].r<=r) return tr[p].maxi;
  long long res=-inf;
  pushdown(p);
  int mid=tr[p].l+tr[p].r>>1;
  if(l<=mid) res=max(res,query(p<<1,l,r));
  if(mid<r) res=max(res,query(p<<1|1,l,r));
  return res;
}
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  cin >> n >> q;
  for(int i=1;i<=n;++i) cin >> a[i];
  build(1,1,n);
  for(int i=1,l,r,x,opt;i<=q;++i){
    cin >> opt;
    if(opt==1){
      cin >> l >> r >> x;
      upd(1,l,r,x,1);
    }
    else if(opt==2){
      cin >> l >> r >> x;
      upd(1,l,r,x,2);
    }
    else{
      cin >> l >> r;
      cout << query(1,l,r) << '\n';
    }
  }
  return 0;
}

根据题面的话应该是1操作挂了,但是蒟蒻看不出来qwq

求帮助

2023/10/26 14:59
加载中...