diff --git a/NowCoder/51008/51008.cpp b/NowCoder/51008/51008.cpp new file mode 100644 index 00000000..9d5b9ea7 --- /dev/null +++ b/NowCoder/51008/51008.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 1e5 + 5; + +int n, m, p = 1, a[N], pre[N], suf[N], ans; +bool vis[N]; +std::priority_queue< + std::pair, + std::vector>, + std::greater<>> + q; + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n >> m; + + for (int i = 1, x; i <= n; i++) { + cin >> x; + + if (a[p] * x < 0) { + a[++p] = x; + } else { + a[p] += x; + } + } + + int cnt = 0; + for (int i = 1; i <= p; i++) { + pre[i] = i - 1; + suf[i] = i + 1; + + if (a[i] > 0) { + ans += a[i]; + cnt++; + } + + q.emplace(std::abs(a[i]), i); + } + + while (cnt > m) { + while (vis[q.top().second]) q.pop(); + + auto o = q.top(); + q.pop(); + + if (pre[o.second] != 0 && suf[o.second] != p + 1 || a[o.second] > 0) { + cnt--; + ans -= o.first; + + int l = pre[o.second], + r = suf[o.second]; + + a[o.second] += a[l] + a[r]; + q.emplace(std::abs(a[o.second]), o.second); + + pre[suf[l]] = pre[l]; + suf[pre[l]] = suf[l]; + vis[l] = true; + + pre[suf[r]] = pre[r]; + suf[pre[r]] = suf[r]; + vis[r] = true; + } + } + + cout << ans << endl; + + return 0; +}