#include <iostream>
#include <vector>
#ifdef LOCAL
#include "print.h"
#else
template <typename... Args> inline void print(const Args&... args) {}
inline void newline() {}
#endif
using ll = long long;
#define endl '\n'
#define FOR(i, n) for (int i = 0; i < n; i++)
using namespace std;
#define time first
#define type second
vector<pair<int, int>> merge(vector<pair<int, int>> intervals) {
if (intervals.empty()) {
return {};
}
// sort(intervals.begin(), intervals.end());
vector<pair<int, int>> merged;
merged.push_back(intervals [0]);
for (int i = 1; i < intervals.size(); i++) {
auto& last = merged.back();
if (last.second + 1 >= intervals [i].first) {
last.second = max(last.second, intervals [i].second);
}
else {
merged.push_back(intervals [i]);
}
}
return merged;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
int length, numrows;
cin >> length >> numrows;
vector<vector<int>> rows;
vector<vector<int>> rowPrefixes;
FOR(_, numrows) {
int x;
cin >> x;
vector<int> row(x), prefix(x + 1, 1);
FOR(j, x) {
cin >> row [j];
prefix [j + 1] = prefix [j] + row [j];
}
rows.push_back(row);
rowPrefixes.push_back(prefix);
}
print(rows, rowPrefixes);
vector<vector<pair<int, int>>> uncovered(numrows);
FOR(i, numrows) {
const auto& prefix = rowPrefixes [i];
FOR(j, prefix.size() - 1) {
uncovered [i].push_back(
{prefix [j], length - (prefix.back() - prefix [j])}
);
}
uncovered [i].push_back({prefix.back(), length});
uncovered [i] = merge(uncovered [i]);
}
print(uncovered);
vector<pair<int, int>> events;
FOR(i, numrows) {
for (const auto& interval: uncovered [i]) {
events.push_back({interval.first, 1});
events.push_back({interval.second, -1});
}
}
sort(events.begin(), events.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
if (a.time == b.time) {
return a.type > b.type;
}
return a.time < b.time;
});
print(events);
vector<pair<int, int>> allUncovered;
int count = 0;
int lastTime = -1;
for (const auto& event: events) {
count += event.type;
if (count == numrows - 1) {
if (lastTime != -1 && lastTime != event.time) {
allUncovered.push_back({lastTime, event.time});
}
}
lastTime = event.time;
}
print(allUncovered);
int ans = 0;
for (const auto& interval: allUncovered) {
ans += interval.second - interval.first + 1;
}
cout << length - ans << endl;
}
# | 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... |