Submission #1259448

#TimeUsernameProblemLanguageResultExecution timeMemory
1259448phtungLasers (NOI19_lasers)C++20
100 / 100
118 ms18820 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Interval = pair<ll,ll>;

vector<Interval> merge_intervals(vector<Interval> a) {
    vector<Interval> res;
    if (a.empty()) return res;
    sort(a.begin(), a.end());
    ll curL = a[0].first, curR = a[0].second;
    for (size_t i = 1; i < a.size(); ++i) {
        if (a[i].first <= curR + 1) {
            curR = max(curR, a[i].second);
        } else {
            res.emplace_back(curL, curR);
            curL = a[i].first;
            curR = a[i].second;
        }
    }
    res.emplace_back(curL, curR);
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll L;
    int R;
    if (!(cin >> L >> R)) return 0;

    vector<Interval> global_forced; // collect forced intervals from all rows

    for (int row = 0; row < R; ++row) {
        int X;
        cin >> X;
        vector<ll> W(X);
        for (int i = 0; i < X; ++i) cin >> W[i];

        // prefix sums P_m (P_0 = 0,...,P_X = T)
        vector<ll> P(X+1, 0);
        for (int i = 1; i <= X; ++i) P[i] = P[i-1] + W[i-1];
        ll T = P[X];

        // collect avoidable intervals [P_m+1, L - (T - P_m)]
        vector<Interval> avoid;
        for (int m = 0; m <= X; ++m) {
            ll l = P[m] + 1;
            ll r = L - (T - P[m]);
            if (l <= r) {
                // clamp to [1,L] although l,r already in that range logically
                if (r < 1 || l > L) continue;
                l = max<ll>(l, 1);
                r = min<ll>(r, L);
                if (l <= r) avoid.emplace_back(l, r);
            }
        }

        // merge avoid intervals
        auto avoidm = merge_intervals(avoid);

        // complement in [1,L] -> forced intervals for this row
        ll cur = 1;
        for (auto &iv : avoidm) {
            if (cur <= iv.first - 1) {
                global_forced.emplace_back(cur, iv.first - 1);
            }
            cur = iv.second + 1;
        }
        if (cur <= L) global_forced.emplace_back(cur, L);
        // note: if avoidm is empty, forced is [1,L] (handled by cur=1 case)
    }

    // merge all forced intervals across rows and sum lengths
    auto merged = merge_intervals(global_forced);
    ll ans = 0;
    for (auto &iv : merged) {
        ans += (iv.second - iv.first + 1);
    }
    cout << ans << '\n';
    return 0;
}
#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...