1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| import java.io.*; public class Main { static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); static int[] a, tg, min; static long[] sum; static void build(int o, int l, int r) { int mid = (l + r) >> 1; if(l == r) { tg[o] = 0; sum[o] = min[o] = a[mid]; } else { build(o << 1, l, mid); build(o << 1 | 1, mid + 1, r); min[o] = Math.min(min[o << 1], min[o << 1 | 1]); sum[o] = sum[o << 1] + sum[o << 1 | 1]; } } static int ql, qr; static int getMin(int o, int l, int r) { if(ql <= l && r <= qr) return min[o]; int mid = (l + r) >> 1; if(tg[o] != 0) { tg[o << 1] += tg[o]; tg[o << 1 | 1] += tg[o]; min[o << 1] += tg[o]; min[o << 1 | 1] += tg[o]; sum[o << 1] += (long)tg[o] * (mid - l + 1); sum[o << 1 | 1] += (long)tg[o] * (r - mid); tg[o] = 0; } int ans = Integer.MAX_VALUE; if(ql <= mid) ans = Math.min(ans, getMin(o << 1, l, mid)); if(mid + 1 <= qr) ans = Math.min(ans, getMin(o << 1 | 1, mid + 1, r)); return ans; } static int x; static void modify(int o, int l, int r) { if(ql <= l && r <= qr) { tg[o] += x; min[o] += x; sum[o] += (long)x * (r - l + 1); } else { int mid = (l + r) >> 1; if(tg[o] != 0) { tg[o << 1] += tg[o]; tg[o << 1 | 1] += tg[o]; min[o << 1] += tg[o]; min[o << 1 | 1] += tg[o]; sum[o << 1] += (long)tg[o] * (mid - l + 1); sum[o << 1 | 1] += (long)tg[o] * (r - mid); tg[o] = 0; } if(ql <= mid) modify(o << 1, l, mid); if(mid + 1 <= qr) modify(o << 1 | 1, mid + 1, r); min[o] = Math.min(min[o << 1], min[o << 1 | 1]); sum[o] = sum[o << 1] + sum[o << 1 | 1]; } } public static void main(String[] args) throws IOException { String s = in.readLine(); String[] ss = s.split(" "); int n = Integer.parseInt(ss[0]), k = Integer.parseInt(ss[1]); s = in.readLine(); ss = s.split(" "); a = new int[n + 1]; for(int i = 1; i <= n; ++i) a[i] = Integer.parseInt(ss[i - 1]); tg = new int[n << 2]; min = new int[n << 2]; sum = new long[n << 2]; long ans = 0; build(1, 1, n); for(int i = 1; i + k - 1 <= n; ++i) { ql = i; qr = i + k - 1; int res = getMin(1, 1, n); if(res > 0) { ans += res; x = -res; modify(1, 1, n); } } ans += sum[1]; out.write(String.format("%d\n", ans)); out.flush(); } }
|