Submission #757822

#TimeUsernameProblemLanguageResultExecution timeMemory
757822taherAutobahn (COI21_autobahn)C++17
100 / 100
96 ms9380 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, k, x;
  cin >> n >> k >> x;
  vector<array<int, 3>> events;
  for (int i = 0; i < n; i++) {
    int l, t, r;
    cin >> l >> t >> r;
    events.push_back({l, +1, 0});
    int s = 0;
    int p = l + t;
    if (p < r + 1) {
      s = 1;
      events.push_back({p, +1, s});
    }
    events.push_back({r + 1, -1, s});
  }
  sort(events.begin(), events.end(), [&](array<int, 3> i, array<int, 3> j) {
    if (i[0] == j[0]) {
      return i[1] < j[1];
    }
    return i[0] < j[0];
  });
  vector<array<int, 2>> d;
  auto Update = [&](int p, int add) {
    if (add == 0) {
      return ;
    }
    if ((int) d.size() > 0 && d.back()[0] == p) {
      d[(int) d.size() - 1][1] += add;
    } else {
      d.push_back({p, add});
    }
    return ;
  };
  int openGood = 0;
  int openAll = 0;
  for (int i = 0; i < (int) events.size(); i++) {
    int s = events[i][2];
    int v = events[i][1];
    int pos = events[i][0];
    if (v == +1) {
      if (s) {
        openGood += 1;
        if (openAll >= k) {
          Update(pos, +1);
        }
      } else {
        openAll += 1;
        if (openAll == k) {
          Update(pos, +openGood);
        }
      }
    } else {
      if (s) {
        openGood -= 1;
        if (openAll >= k) {
          Update(pos, -1);
        }
      }
      openAll -= 1;
      if (openAll == k - 1) {
        Update(pos, -openGood);
      }
    }
  }

  const int inf = 1000000000;

  int len = (int) d.size();

  vector<long long> prefD(len);
  vector<long long> prefP(len);
  for (int i = 0; i < len; i++) {
    if (i > 0) {
      prefD[i] += prefD[i - 1];
      prefP[i] += prefP[i - 1];
    }
    prefD[i] += d[i][1];
    prefP[i] += 1LL * d[i][0] * d[i][1];
  }

  auto Calc = [&](int ptRight) {
    auto ptr0 = lower_bound(d.begin(), d.end(), array<int, 2> ({ptRight - x, inf})) - d.begin();
    auto ptr1 = lower_bound(d.begin(), d.end(), array<int, 2> ({ptRight, inf})) - d.begin();
    ptr1 -= 1;
    if (ptr1 < 0) return 0LL;
    long long ret = 1LL * (ptRight + 1) * (prefD[ptr1] - (ptr0 > 0 ? prefD[ptr0 - 1] : 0LL)) - (prefP[ptr1] - (ptr0 > 0 ? prefP[ptr0 - 1] : 0LL));
    if (ptr0 > 0) {
      assert(ptRight > x);
      ret += 1LL * prefD[ptr0 - 1] * x;
    }
    return ret;
  };

  long long res = 0;

  for (int i = 0; i < (int) d.size(); i++) {
    int pos = d[i][0];
    int c = d[i][1];
    if (c < 0) {
      res = max(res, Calc(pos - 1));
    }
  }

  cout << res << '\n';
  return 0; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...