- 扶苏的问题
60wa
- 2024-12-31 13:51:56 @
#include <iostream>
#define N 1145141919810
#define int long long
using namespace std;
int n,q,a[10000001],d[10000001],f1[10000001],f2[10000001];//f1表示覆盖的标记,f2表示增加的标记
void build_tree(int s,int t,int p){
if(s == t){
d[p] = a[s];
f1[p]=N;
return;
}
int m = (s+t)/2;
build_tree(s,m,2*p);
build_tree(m+1,t,2*p+1);
d[p] = max(d[2*p],d[2*p+1]);
f1[p]=N;
}
void pushdamn(int p){
if (f1[p]!=N){
f2[p*2]=0;
f2[p*2+1]=0;
d[p*2]=f1[p];
d[p*2+1]=f1[p];
f1[p*2]=f1[p];
f1[p*2+1]=f1[p];
f1[p]=N;
}
d[p*2]+=f2[p];
d[p*2+1]+=f2[p];
f2[p*2]+=f2[p];
f2[p*2+1]+=f2[p];
f2[p]=0;
}
void fugai(int s,int t,int p,int l,int r,int x){
if(l <= s && t <= r){
f1[p]=x;
f2[p]=0;
d[p]=x;
return;
}
pushdamn(p);
int m = (s+t)/2;
if (l<=m)fugai(s,m,2*p,l,r,x);
if (m<r)fugai(m+1,t,2*p+1,l,r,x);
d[p] = max(d[2*p],d[2*p+1]);
}
void _add(int s, int t, int p, int l, int r, int x){
if(l <= s && t <= r){
if (f1[p]!=N){
f1[p]+=x;
d[p]=f1[p];
}else{
f2[p]+=x;
d[p]+=x;
}
return;
}
pushdamn(p);
int m = (s+t)/2;
if (l<=m)_add(s,m,2*p,l,r,x);
if (m<r)_add(m+1,t,2*p+1,l,r,x);
d[p] = max(d[2*p],d[2*p+1]);
}
int get_max(int s,int t,int p,int l,int r){
if (l<=s && t<=r){
return d[p];
}
pushdamn(p);
int mid=(s+t)>>1;
int maxx=-N;
if (l<=mid)maxx=max(maxx,get_max(s,mid,p*2,l,r));
if (mid<r)maxx=max(maxx,get_max(mid+1,t,p*2+1,l,r));
return maxx;
}
signed 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_tree(1,n,1);
while(q--){
int op;
cin >> op;
if(op == 1){
int l,r,x;
cin >> l >> r >> x;
fugai(1,n,1,l,r,x);
}else if(op == 2){
int l,r,x;
cin >> l >> r >> x;
_add(1,n,1,l,r,x);
}else if(op == 3){
int l,r;
cin >> l >> r;
cout << get_max(1,n,1,l,r) << "\n";
}
}
return 0;
}
1 comments
-
C23panweiming LV 6 @ 2025-1-6 13:59:29Edited
就是
pushdamn
和 更新函数写错了你的正确代码
#include <iostream> #define N 1145141919810000ULL #define int long long using namespace std; int n,q; int a[10000001]; int d[10000001]; int f1[10000001];//f1表示覆盖的标记 int f2[10000001];//f2表示增加的标记 void build_tree(int s,int t,int p){ f1[p]=N; if(s == t){ d[p] = a[s]; return; } int m = (s+t)/2; build_tree(s,m,2*p); build_tree(m+1,t,2*p+1); d[p] = max(d[2*p],d[2*p+1]); } void pushdamn(int p){ if (f1[p]!=N){ d[p*2]=f1[p]+f2[p]; d[p*2+1]=f1[p]+f2[p]; f1[p*2]=f1[p]; f1[p*2+1]=f1[p]; f2[p*2]=f2[p]; f2[p*2+1]=f2[p]; f1[p]=N; } else { d[p*2]+=f2[p]; d[p*2+1]+=f2[p]; f2[p*2]+=f2[p]; f2[p*2+1]+=f2[p]; } f2[p]=0; } void fugai(int s,int t,int p,int l,int r,int x){ if(l <= s && t <= r){ d[p]=x; f1[p]=x; f2[p]=0; return; } pushdamn(p); int m = (s+t)/2; if (l<=m)fugai(s,m,2*p,l,r,x); if (m<r)fugai(m+1,t,2*p+1,l,r,x); d[p] = max(d[2*p],d[2*p+1]); } void _add(int s, int t, int p, int l, int r, int x){ if(l <= s && t <= r){ d[p]+=x; f2[p]+=x; return; } pushdamn(p); int m = (s+t)/2; if (l<=m)_add(s,m,2*p,l,r,x); if (m<r)_add(m+1,t,2*p+1,l,r,x); d[p] = max(d[2*p],d[2*p+1]); } int get_max(int s,int t,int p,int l,int r){ if (l<=s && t<=r){ return d[p]; } pushdamn(p); int mid=(s+t)>>1; int maxx=-N; if (l<=mid)maxx=max(maxx,get_max(s,mid,p*2,l,r)); if (mid<r)maxx=max(maxx,get_max(mid+1,t,p*2+1,l,r)); return maxx; } signed 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_tree(1,n,1); while(q--){ int op; cin >> op; if(op == 1){ int l,r,x; cin >> l >> r >> x; fugai(1,n,1,l,r,x); }else if(op == 2){ int l,r,x; cin >> l >> r >> x; _add(1,n,1,l,r,x); }else if(op == 3){ int l,r; cin >> l >> r; cout << get_max(1,n,1,l,r) << "\n"; } } return 0; }
- 1
Information
- ID
- 294
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 105
- Accepted
- 6
- Uploaded By