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
   | #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> int read(){     register int x = 0;     register char f = 1, ch = getchar();     for (; !isdigit(ch); ch = getchar()) if (ch == '-') f ^= 1;     for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ '0');     return f ? x : -x; } #define N 300005 struct Segment_Tree{     int val[N << 2], lz[N << 2];     void up(int u){         val[u] = std :: min(val[u << 1], val[u << 1 | 1]);     }     void add(int u, int x){         lz[u] += x, val[u] += x;     }     void down(int u){         if (lz[u]) add(u << 1, lz[u]), add(u << 1 | 1, lz[u]), lz[u] = 0;     }     void modify(int u, int l, int r, int L, int R, int x){         if (L <= l && r <= R) return add(u, x), void(0);         int md = (l + r) >> 1;         down(u);         if (L <= md) modify(u << 1, l, md, L, R, x);         if (R > md) modify(u << 1 | 1, md + 1, r, L, R, x);         up(u);     }     bool query(){ return val[1] >= 0; } }T; int n, m, h, a[N], b[N], t, c[N], ans; int main(){     n = read(), m = read(), h = read();     for (register int i = 1; i <= m; ++i) b[i] = h - read(), c[++t] = b[i];     for (register int i = 1; i <= n; ++i) a[i] = read(), c[++t] = a[i];     std :: sort(c + 1, c + 1 + t);     t = std :: unique(c + 1, c + 1 + t) - c - 1;     for (register int i = 1; i <= m; ++i)         b[i] = std :: lower_bound(c + 1, c + 1 + t, b[i]) - c;     for (register int i = 1; i <= n; ++i)         a[i] = std :: lower_bound(c + 1, c + 1 + t, a[i]) - c;     for (register int i = 1; i <= m; ++i)         T.modify(1, 1, t, b[i], t, 1), T.modify(1, 1, t, a[i], t, -1);     ans = T.query();     for (register int i = m + 1; i <= n; ++i)         T.modify(1, 1, t, a[i], t, -1), T.modify(1, 1, t, a[i - m], t, 1), ans += T.query();     printf("%d\n", ans); }
   |