https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4620
区间左右更新
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostream> #include <cmath> #include <queue> #include <vector> using namespace std; #define N 510000 #define INF 0x3f3f3f3f #define met(a, b) memset(a, b, sizeof(a)) const double EPS = 1e-8; typedef long long LL; LL a[N], k; int len; struct node { int l;///区间左端 LL sum; }p[N]; void Solve (int l, int r) { LL sum = 0, s = p[r].sum;///区间最大值 if (s<k) return; while (l < r) { sum += a[l]; if (s-sum >= k) { p[r].sum = s-sum; p[r].l = l+1;///更新区间左端 } l++; } len = min (len, r-p[r].l+1); } int main () { int t, n; scanf ("%d", &t); while (t--) { met (a, 0); met (p, 0); scanf ("%d %lld", &n, &k); p[0].l = 1, len = INF; for (int i=1; i<=n; i++) { scanf ("%lld", &a[i]); if (p[i-1].sum>0) { p[i].sum = a[i]+p[i-1].sum; p[i].l = p[i-1].l; } else { p[i].sum = a[i]; p[i].l = i; } Solve (p[i].l, i); } if (len==INF) len = -1; printf ("%d\n", len); } return 0; }