제출 #1117269

#제출 시각아이디문제언어결과실행 시간메모리
1117269Trisanu_DasLasers (NOI19_lasers)C++17
51 / 100
1074 ms54028 KiB
#include <bits/stdc++.h>
using namespace std;
 
map<int, int> cnt;
int tot = 0, pref[500010];
 
void ins (int a) {
  if (cnt[a]) cnt[a]++;
  else {
    cnt[a] = 1; tot++;
  }
};
 
void er (int a) {
  cnt[a]--;
  if (cnt[a] == 0) tot--;
};
 
 
int main() {
  
  ios_base::sync_with_stdio(false); cin.tie(0);
  int N, M; cin >> N >> M;
  vector<int> points;
  vector<pair<int, int>> events;
  for (int i = 1; i <= M; i++) {
    int k; cin >> k;
    for (int j = 0; j < k; j++) {
      int x; cin >> x;
      pref[j+1] = pref[j] + x; 
    }
    for (int j = 0; j <= k; j++) {
      points.push_back(pref[j] + 1); points.push_back(N - pref[k] + pref[j] + 1);
      events.push_back({pref[j] + 1, i}); events.push_back({N - pref[k] + pref[j] + 1, -i});
    }
  }
  sort(points.begin(), points.end());
  sort(events.begin(), events.end());
  points.erase(unique(points.begin(), points.end()), points.end());
  int ans = N, ind = 0, esz = events.size(), psz = points.size();
  for (int i = 0; i < psz; i++) {
    int point = points[i];
    while (ind < esz && events[ind].first == point) {
      if (events[ind].second > 0) ins(events[ind].second);
      else er(abs(events[ind].second));
      ind++;
    }
    if (tot == M) {
      if (i+1 < psz) ans -= points[i+1] - point;
      else ans -= N - point;
    }
  }
  cout << ans << '\n';
}
#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...