tyvj/joyoi 1305 最大子序和
带了一个转化的单调队列裸题。
转化为前缀和相减即可。
有一点需要注意:从0开始入队而不是1,因为要统计第一个。
(从网上找的对拍程序,结果别人写错了)
1 /** 2 freopen("in.in", "r", stdin); 3 freopen("my.out", "w", stdout); 4 */ 5 //// ///////////////////////////// 6 #include <cstdio> 7 const int N = 300010; 8 9 int a[N], sum[N], Q[N], t, e = 1; 10 11 inline void max(int &a, const int b) { 12 if(a < b) a = b; 13 return; 14 } 15 16 int main() { 17 //freopen("in.in", "r", stdin); 18 //freopen("my.out", "w", stdout); 19 int n, M; 20 scanf("%d%d", &n, &M); 21 for(int i = 1; i <= n; i++) { 22 scanf("%d", &a[i]); 23 sum[i] = sum[i - 1] + a[i]; 24 } 25 26 /* 27 for(int i = 1; i <= n; i++) { 28 printf("%d ", sum[i]); 29 } 30 printf("\n"); 31 */ 32 33 int ans = -0x3f3f3f3f; 34 for(int i = 0; i <= n; i++) { /// !! 0 35 Q[++t] = i; 36 if(Q[e] < i - M) { 37 e++; 38 } 39 max(ans, sum[i] - sum[Q[e]]); 40 while(e < t && sum[i] <= sum[Q[t - 1]]) { 41 Q[--t] = i; 42 } 43 } 44 printf("%d", ans); 45 return 0; 46 }