#include<bits/stdc++.h> using namespace std; const int N=2e6+10; int p[N]={0}; int dp[N],Index[N]; int t=0; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ int x; scanf("%d",&x); p[i]=p[i-1]+x; } for(int i=0;i<=n;i++){ if(!t||dp[t]>p[i])dp[++t]=p[i],Index[t]=i; } int ans=0; for(int i=n;i>=1;i--){ while(Index[t]>=i)t--; while(t>0&&p[i]-dp[t]>0)ans=max(ans,i-Index[t]),t--; if(t==0)break; } cout<<ans<<endl; }我D题是建一个单调递减的数组,每次从后面往前面更新,这样就过了,但是我感觉这样做法有点错误。😂😂