Submission #1062367

#TimeUsernameProblemLanguageResultExecution timeMemory
1062367kunzaZa183Port Facility (JOI17_port_facility)C++17
0 / 100
0 ms348 KiB
#include <bits/stdc++.h>
using namespace std;
int main() {
  // cin.tie(0)->sync_with_stdio(0);
  // cin.exceptions(cin.failbit);
  int n;
  cin >> n;
  vector<pair<int, int>> vpii(n);
  struct event {
    int tim;
    bool ins;
    int val;
    event() { tim = -1, ins = 0, val = -1; }
    event(int a, int b, int c) { tim = a, ins = b, val = c; }
    bool operator<(event x) const { return tim < x.tim; }
  };
  vector<event> times; // tim id
  for (int i = 0; i < vpii.size(); i++) {
    cin >> vpii[i].first >> vpii[i].second;
    times.emplace_back(vpii[i].first, 1, i);
    times.emplace_back(vpii[i].second, 0, i);
  }
  sort(times.begin(), times.end());

  vector<int> dsu(2 * n);
  iota(dsu.begin(), dsu.end(), 0);
  function<int(int)> par = [&](int cur) {
    if (dsu[cur] == cur)
      return cur;
    dsu[cur] = par(dsu[cur]);
    return dsu[cur];
  };

  struct kun {
    int head;
    mutable pair<int, int> dura;
    kun() { head = 0, dura = {0, 0}; }
    kun(int a, int b, int c) { head = a, dura = {b, c}; }
    bool operator<(kun x) const { return dura < x.dura; }
  };
  set<kun, less<>> spii; // tim, pile
  for (auto a : times) {
    // cout << a.tim << "\n";
    // for (auto a : spii) {
    //   cout << a.head << " " << a.dura.first << " " << a.dura.second << "\n";
    // }
    if (!spii.empty()) {
      spii.begin()->dura.first = max(spii.begin()->dura.first, a.tim + 1);
      if (spii.begin()->dura.first > spii.begin()->dura.second) {
        spii.erase(spii.begin());
      }
    }

    if (a.ins) {
      kun tmp(a.val, vpii[a.val].second, vpii[a.val].second);
      auto it = spii.upper_bound(tmp);
      if (it == spii.begin()) {
        spii.insert(tmp);
        continue;
      }

      kun tmp2;
      while (1) {
        if (it == spii.begin())
          break;
        it--;
        dsu[par(it->head)] = par(tmp.head + n);
        dsu[par(it->head + n)] = par(tmp.head);
        tmp2.head = it->head;
        tmp2.dura.second = max(tmp2.dura.second, it->dura.second);
        tmp2.dura.first = it->dura.first;
        it = spii.erase(it);
      }

      spii.insert(tmp2);
      spii.insert(tmp);
    }
  }

  for (int i = 0; i < n; i++)
    if (par(i) == par(i + n)) {
      cout << "0\n";
      return 0;
    }

  set<int> si;
  for (int i = 0; i < 2 * n; i++)
    si.insert(par(i));

  long long ans = 1;
  const int MOD = 1e9 + 7;
  for (int i = 0; i < si.size() / 2; i++) {
    ans *= 2;
    ans %= MOD;
  }

  cout << ans << "\n";
}

Compilation message (stderr)

port_facility.cpp: In function 'int main()':
port_facility.cpp:18:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |   for (int i = 0; i < vpii.size(); i++) {
      |                   ~~^~~~~~~~~~~~~
port_facility.cpp:92:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |   for (int i = 0; i < si.size() / 2; i++) {
      |                   ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...