Submission #1133906

#TimeUsernameProblemLanguageResultExecution timeMemory
1133906hoaphat1Feast (NOI19_feast)C++20
100 / 100
74 ms14764 KiB
#include<bits/stdc++.h>

using namespace std;

struct T {
	long long cost;
	int l, r;
	T(long long cost, int l, int r) : cost(cost), l(l), r(r) {
	}
	bool operator < (const T& other) const {
		return cost < other.cost;
	}
};

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
//	freopen("test.inp", "r", stdin);
	int n, k;
	cin >> n >> k;
	vector<int> a(n);
	for (int i = 0; i < n; i++) cin >> a[i];
	int l = 0, r = n - 1;
	while (l < n && a[l] <= 0) l++;
	while (r >= 0 && a[r] <= 0) r--;
	if (l > r) {
		cout << 0;
		return 0;
	}
	a = vector<int> (a.begin() + l, a.begin() + r + 1);
	n = (int)a.size();
	vector<T> t;
	vector<int> prev(n + 1, -1);
	vector<int> nxt(n + 1, -1);
	vector<long long> res(n);
	for (int i = 0; i < n; i++) {
		int j = i + 1;
		long long now = a[i];
		while (j < n && (a[i] > 0) == (a[j] > 0)) now += a[j++];
		t.push_back(T(now, i, j));
				
			nxt[i] = j;
			prev[j] = i;
		
		res[i] = -abs(now);
		i = j - 1;
	}
	if (n == 1) {
		cout << max(a[0], 0);
		return 0;
	}
	priority_queue<T> pq;
	long long ans = 0;
	for (int i = 0; i < (int) t.size(); i++) {
		if (t[i].cost > 0) ans += t[i].cost, --k;
		pq.push(T{-abs(t[i].cost), t[i].l, t[i].r});
//		cout << t[i].cost <<" " << t[i].l <<" " << t[i].r << endl;
	}
//	cout << k << " " << nxt[72] << endl;
	vector<int> flag(n + 1);
	while (!pq.empty() && k < 0) {
		/*
			a-x-b mn 
			a + b -> a + b + mn - x
		*/
		auto x = pq.top(); pq.pop();
		long long cost = x.cost;
		int l = x.l, r = x.r;
		int ll = prev[l], rr = nxt[r];
//	for (int i = 0; i < n; i++) cout << res[i] <<" "; cout << endl;
		if (res[l] != cost || flag[l] || flag[r]) continue;
//		cout << cost <<" " << l <<" " << r << " " << ll <<" " << rr << endl;
		k++;
		ans += cost;
		flag[l] = flag[r] = true;
		if (ll == -1) {
			long long val = res[r] - cost;
			res[l] = val;
			nxt[l] = rr;
			prev[rr] = l;
			pq.push(T{val, l, rr});
			continue;
		}
		if (rr == -1) {
			long long val = res[ll] - cost;
			res[ll] = val;
			nxt[ll] = r;
			prev[r] = ll;
			pq.push(T{val, ll, r});
			continue;
		}
		long long val = res[ll] + res[r] - cost;
		res[ll] = val;
		nxt[ll] = rr;
		prev[rr] = ll;
//		cout << "cal " << val <<" " << ll <<" " << rr << endl;
		pq.push(T{val, ll, rr});
	}
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...