Submission #1158750

#TimeUsernameProblemLanguageResultExecution timeMemory
1158750aegLasers (NOI19_lasers)C++20
10 / 100
54 ms7668 KiB
#include <bits/stdc++.h>
using namespace std;

struct segmentset {
  set<pair<int, int>> s;
  int ans() {
    int ret = 0;
    for(auto &[x, y]: s) ret += y - x + 1;
    return ret;
  }
  void insert(int l, int r) {
    if (s.size() == 0) {
      s.insert({
	  l, r});
      return;
    }
    auto a = s.lower_bound({
	l, INT_MIN});
    while (a != s.end() && r >= a->first) {
      r = max(r, a->second);
      s.erase(*a);
      a = s.lower_bound({
	  l, INT_MIN});
    }
    while (a != s.begin()) {
      a--;
      if (l <= a->first) {
	l = min(l, a->first);
	s.erase(*a);
	a = s.lower_bound({
	    l, INT_MIN});
      }
      else break;
    }
    s.insert({l, r});
  }
};

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int l, r;
  cin >> l >> r;
  segmentset s;
  while (r--) {
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> ri(n);
    vector<int> li(n);
    for (auto &x : a) {
      cin >> x;
    }
    int curi = 0;
    for (int i = 0; i < n; i++) {
      curi += a[i];
      ri[i] = curi;
    }
    curi = l + 1;
    for (int i = n-1; i >= 0; i--) {
      curi -= a[i];
      li[i] = curi;
    }
    for (int i = 0; i < n; i++) {
      if(li[i] <= ri[i]) s.insert(li[i], ri[i]);
    }
  }
  cout << s.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...