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 }
AC代码

 

posted @ 2018-05-19 14:09  garage  阅读(122)  评论(0编辑  收藏  举报