Submission #972834

#TimeUsernameProblemLanguageResultExecution timeMemory
972834abczzPort Facility (JOI17_port_facility)C++14
100 / 100
2247 ms975100 KiB
#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
#include <map>
#define ll long long

using namespace std;

bool B[2000000];
vector <ll> V;
vector <array<ll, 2> > R, Q;
ll A[2000000], L[2000000], M = 1e9 + 7;
struct SegTree{
  vector <ll> st[8000000];
  vector <ll> st2[8000000];
  void build(ll id, ll l, ll r) {
    if (l == r) {
      if (A[l] != -1) st[id].push_back(A[l]);
      else st2[id].push_back(L[l]);
      return;
    }
    ll mid = (l+r)/2;
    build(id*2, l, mid);
    build(id*2+1, mid+1, r);
    int i = 0, j = 0;
    while (i < st[id*2].size() && j < st[id*2+1].size()) {
      if (st[id*2][i] < st[id*2+1][j]) st[id].push_back(st[id*2][i++]);
      else st[id].push_back(st[id*2+1][j++]);
    }
    while (i < st[id*2].size()) st[id].push_back(st[id*2][i++]);
    while (j < st[id*2+1].size()) st[id].push_back(st[id*2+1][j++]);
    i = 0, j = 0;
    while (i < st2[id*2].size() && j < st2[id*2+1].size()) {
      if (st2[id*2][i] > st2[id*2+1][j]) st2[id].push_back(st2[id*2][i++]);
      else st2[id].push_back(st2[id*2+1][j++]);
    }
    while (i < st2[id*2].size()) st2[id].push_back(st2[id*2][i++]);
    while (j < st2[id*2+1].size()) st2[id].push_back(st2[id*2+1][j++]);
  }
  void query(ll id, ll l, ll r, ll ql, ll qr) {
    if (qr < l || r < ql) return;
    else if (ql <= l && r <= qr) {
      while (!st[id].empty()) {
        auto u = st[id].back();
        if (B[u] || qr < u) {
          if (!B[u]) {
            R.push_back({L[u], u});
            B[L[u]] = B[u] = 1;
          }
          st[id].pop_back();
        }
        else break;
      }
      while (!st2[id].empty()) {
        auto u = st2[id].back();
        if (B[u] || u < ql) {
          if (!B[u]) {
            R.push_back({u, A[u]});
            B[u] = B[A[u]] = 1;
          }
          st2[id].pop_back();
        }
        else break;
      }
      return;
    }
    ll mid = (l+r)/2;
    query(id*2, l, mid, ql, qr);
    query(id*2+1, mid+1, r, ql, qr);
  }
} ST;
ll n, a, b, f = 1;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cin >> n;
  for (int i=0; i<2*n; ++i) A[i] = L[i] = -1;
  for (int i=0; i<n; ++i) {
    cin >> a >> b;
    --a, --b;
    L[b] = a;
    A[a] = b;
  }
  ST.build(1, 0, 2*n-1);
  for (int i=0; i<2*n; ++i) {
    if (!B[i]) {
      f *= 2;
      f %= M;
      B[i] = B[A[i]] = 1;
      R.clear();
      Q.clear();
      Q.push_back({i, A[i]});
      while (true) {
        for (auto [l, r] : Q) {
          ST.query(1, 0, 2*n-1, l, r);
        }
        Q.clear();
        V.clear();
        if (R.empty()) break;
        sort(R.begin(), R.end());
        for (auto [x, y] : R) {
          while (!V.empty() && V.back() < x) {
            V.pop_back();
          }
          if (!V.empty() && V.back() < y) {
            cout << "0\n";
            return 0;
          }
          V.push_back(y);
        }
        swap(R, Q);
      }
    }
  }
  cout << f << '\n';
}

Compilation message (stderr)

port_facility.cpp: In member function 'void SegTree::build(long long int, long long int, long long int)':
port_facility.cpp:27:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |     while (i < st[id*2].size() && j < st[id*2+1].size()) {
      |            ~~^~~~~~~~~~~~~~~~~
port_facility.cpp:27:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |     while (i < st[id*2].size() && j < st[id*2+1].size()) {
      |                                   ~~^~~~~~~~~~~~~~~~~~~
port_facility.cpp:31:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |     while (i < st[id*2].size()) st[id].push_back(st[id*2][i++]);
      |            ~~^~~~~~~~~~~~~~~~~
port_facility.cpp:32:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |     while (j < st[id*2+1].size()) st[id].push_back(st[id*2+1][j++]);
      |            ~~^~~~~~~~~~~~~~~~~~~
port_facility.cpp:34:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |     while (i < st2[id*2].size() && j < st2[id*2+1].size()) {
      |            ~~^~~~~~~~~~~~~~~~~~
port_facility.cpp:34:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |     while (i < st2[id*2].size() && j < st2[id*2+1].size()) {
      |                                    ~~^~~~~~~~~~~~~~~~~~~~
port_facility.cpp:38:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |     while (i < st2[id*2].size()) st2[id].push_back(st2[id*2][i++]);
      |            ~~^~~~~~~~~~~~~~~~~~
port_facility.cpp:39:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     while (j < st2[id*2+1].size()) st2[id].push_back(st2[id*2+1][j++]);
      |            ~~^~~~~~~~~~~~~~~~~~~~
port_facility.cpp: In function 'int main()':
port_facility.cpp:95:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   95 |         for (auto [l, r] : Q) {
      |                   ^
port_facility.cpp:102:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  102 |         for (auto [x, y] : R) {
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...