제출 #1292579

#제출 시각아이디문제언어결과실행 시간메모리
1292579yonatanlLasers (NOI19_lasers)C++20
100 / 100
376 ms66720 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <set>

#define rep(i, s, e) for (ll i = s; i < e; i++)
#define upmax(a, b) a = max(a, b)
#define upmin(a, b) a = min(a, b)

using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using vvpll = vector<vpll>;

const ll INF = 1e18;

void solve() {
	ll l, n;
	cin >> l >> n;
	vvll arr(n);
	vll x(n);
	vll sum(n);
	rep(i, 0, n) {
		cin >> x[i];
		arr[i].resize(x[i]);
		rep(j, 0, x[i]) {
			cin >> arr[i][j];
			sum[i] += arr[i][j];
		}
	}
	set<pair<ll, pll>> sR; // {right, {idx, i}}
	ll left = 0; // Max left of all rows
	rep(i, 0, n) {
		sR.insert({ sum[i], {0, i}});
	}
	auto temp = --(sR.end());
	ll right = (*temp).first;
	ll lastLeft = l - right; // [1, a] is good already
	ll ans = lastLeft;
	left = lastLeft;
	while (!sR.empty()) {
		/*for (auto& it : sR) {
			cout << it.first << ' ' << it.second.first << " " << it.second.second << endl;
		}
		cout << endl;*/
		auto it = --(sR.end());
		ll right = (*it).first;
		ll idx = (*it).second.first;
		ll i = (*it).second.second;
		upmax(left, sum[i] - right + arr[i][idx]);
		sR.erase(it);
		if (idx < x[i] - 1) sR.insert({ right - arr[i][idx], {idx + 1, i} });
		if (sR.empty()) {
			// [left, l] is good
			ans += l - left;
		}
		else {
			auto it2 = --(sR.end());
			ll curRight = l - (*it2).first;
			if (left < curRight) {
				ans += curRight - left;
				upmax(left, curRight);
			}
		}
	}
	cout << l - ans << endl;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	solve();
}
#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...