Rt , 为什么不开 O2 会 RE ? 我只听过开 O2 RE .
#include<bits/stdc++.h>
#define int long long
#define lson (k<<1)
#define rson (k<<1|1)
#define mid (l+r>>1)
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=1e6+10,INF=1e12;
int n,k,a[MAXN],dp[MAXN],mx[MAXN<<2],tag[MAXN<<2];
void push_down(int k,int l,int r) {
mx[lson]+=tag[k],mx[rson]+=tag[k],tag[lson]+=tag[k],tag[rson]+=tag[k];tag[k]=0;
}
void push_up(int k) {
mx[k]=max(mx[lson],mx[rson]);
}
void update(int k,int l,int r,int x,int y,int val) {
if(y<l) return ;
if(x<=l&&r<=y) return mx[k]+=val,tag[k]+=val,void();
push_down(k,l,r);
if(x<=mid) update(lson,l,mid,x,y,val); if(y>mid) update(rson,mid+1,r,x,y,val);
push_up(k);
return ;
}
int query(int k,int l,int r,int x,int y) {
if(x<=l&&r<=y) return mx[k];
push_down(k,l,r);
if(x>r||l>y) return -0x3f3f3f3f3f3f3f3f;
return max(query(lson,l,mid,x,y),query(rson,mid+1,r,x,y));
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>k;
ffor(i,1,n) cin>>a[i];
dp[1]=a[1]-INF;stack<pair<pair<int,int>,int>> st;st.push({{0,0},INF});st.push({{1,1},a[1]});
int mmx=a[1];
ffor(i,2,n) {
int lst=i;
while(st.top().second<=a[i]) {
int L=st.top().first.first,R=st.top().first.second,w=st.top().second;
lst=min(lst,L);st.pop();update(1,1,n,L-1,R-1,a[i]-w);
}
mmx=max(mmx,a[i]);
update(1,1,n,i-1,i-1,dp[i-1]+a[i]);
int l=i-k,r=i-1;
dp[i]=query(1,1,n,max(1ll,l),r)-INF;
if(l<=0) dp[i]=max(dp[i],mmx-INF);
st.push({{lst,i},a[i]});
}
cout<<dp[n]+((n-1)/k+1)*INF;
return 0;
}
是不是线段树给我整爆栈了 ?