#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll L;
int R;
if (!(cin >> L >> R)) return 0;
vector<pair<ll,ll>> global_unavoidable;
global_unavoidable.reserve(1000);
for (int ri = 0; ri < R; ++ri) {
int t; cin >> t;
vector<ll> ps;
ps.reserve(t + 1);
ps.push_back(0);
for (int j = 0; j < t; ++j) {
ll w; cin >> w;
ps.push_back(ps.back() + w);
}
ll S = ps.back();
if (S == L) {
// This row forces all lasers
cout << L << '\n';
return 0;
}
ll F = L - S;
if (F <= 0) {
// no free space (S >= L handled above), but guard
global_unavoidable.emplace_back(1, L);
continue;
}
// Build avoidable intervals [x+1, x+F] for each prefix x in ps
vector<pair<ll,ll>> avoid;
avoid.reserve(ps.size());
for (ll x : ps) {
ll l = x + 1;
ll r = x + F;
if (l > L || r < 1) continue;
if (l < 1) l = 1;
if (r > L) r = L;
if (l <= r) avoid.emplace_back(l, r);
}
if (avoid.empty()) {
// Nothing avoidable -> whole [1..L] unavoidable
global_unavoidable.emplace_back(1, L);
continue;
}
// Merge avoidable intervals (they are in increasing left order because ps is increasing)
vector<pair<ll,ll>> merged_avoid;
merged_avoid.reserve(avoid.size());
for (size_t i = 0; i < avoid.size(); ++i) {
ll l = avoid[i].first;
ll r = avoid[i].second;
if (merged_avoid.empty() || merged_avoid.back().second + 1 < l) {
merged_avoid.emplace_back(l, r);
} else {
if (r > merged_avoid.back().second)
merged_avoid.back().second = r;
}
}
// Complement of merged_avoid inside [1..L] -> unavoidable intervals for this row
ll cur = 1;
for (size_t i = 0; i < merged_avoid.size(); ++i) {
ll l = merged_avoid[i].first;
ll r = merged_avoid[i].second;
if (cur < l) {
global_unavoidable.emplace_back(cur, l - 1);
}
cur = r + 1;
if (cur > L) break;
}
if (cur <= L) {
global_unavoidable.emplace_back(cur, L);
}
}
if (global_unavoidable.empty()) {
cout << 0 << '\n';
return 0;
}
// Merge global unavoidable intervals
sort(global_unavoidable.begin(), global_unavoidable.end());
ll ans = 0;
pair<ll,ll> cur = global_unavoidable[0];
for (size_t i = 1; i < global_unavoidable.size(); ++i) {
pair<ll,ll> iv = global_unavoidable[i];
if (cur.second + 1 < iv.first) {
ans += (cur.second - cur.first + 1);
cur = iv;
} else {
if (iv.second > cur.second) cur.second = iv.second;
}
}
ans += (cur.second - cur.first + 1);
if (ans > L) ans = L;
cout << ans << '\n';
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |