Submission #1150463

#TimeUsernameProblemLanguageResultExecution timeMemory
1150463fryingducPort Facility (JOI17_port_facility)C++20
100 / 100
2025 ms217864 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 2e6 + 6;
const int mod = 1e9 + 7;
int n, l[maxn], r[maxn];
int id[maxn], c[maxn];

struct segment_tree {
  int tree[maxn << 2];
  segment_tree() {
    memset(tree, -0x3f, sizeof(tree));
  }
  void update(int pos, int val, int ind, int l, int r) {
    if (l == r) {
      tree[ind] = val;
      return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) {
      update(pos, val, ind << 1, l, mid);
    } else {
      update(pos, val, ind << 1 | 1, mid + 1, r);
    }
    tree[ind] = max(tree[ind << 1], tree[ind << 1 | 1]);
  }
  
  int get(int x, int y, int ind, int l, int r) {
    if (x > y || l > y || r < x) return -1e9;
    if (x <= l and r <= y) {
      return tree[ind];
    }
    int mid = (l + r) >> 1;
    return max(get(x, y, ind << 1, l, mid), get(x, y, ind << 1 | 1, mid + 1, r));
  }
} sf, sb;

void dfs(int u, int col) {
  c[u] = col + 1;
  while (true) {
    int x = sf.get(l[u] + 1, r[u] - 1, 1, 1, n * 2);
    if (x <= r[u]) break;
    x = id[x];
    sf.update(l[x], -1e9, 1, 1, n * 2);
    sb.update(r[x], -1e9, 1, 1, n * 2);
    dfs(x, col ^ 1);
  }
  while (true) {
    int x = sb.get(l[u] + 1, r[u] - 1, 1, 1, n * 2);
    if (-x >= l[u]) break;
    x = id[-x];
    sf.update(l[x], -1e9, 1, 1, n * 2);
    sb.update(r[x], -1e9, 1, 1, n * 2);
    dfs(x, col ^ 1);
  }
}

void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> l[i] >> r[i];
    id[l[i]] = id[r[i]] = i;
    sf.update(l[i], r[i], 1, 1, n * 2);
    sb.update(r[i], -l[i], 1, 1, n * 2);
  }
  int ans = 1;
  for (int i = 1; i <= n; ++i) {
    if (c[i]) continue;
    ans = ans + ans;
    if (ans >= mod) ans -= mod;
    dfs(i, 0);
  }
  vector<pair<int, int>> interval;
  for (int ite = 1; ite <= 2; ++ite) {
    interval.clear();
    for (int i = 1; i <= n; ++i) {
      if (c[i] == ite) {
        interval.emplace_back(l[i], i);
        interval.emplace_back(r[i], -i);
      }
    }
    sort(interval.begin(), interval.end());
    stack<int> st;
    for (auto i:interval) {
      if (i.second > 0) {
        st.push(i.second);
      } else {
        if (st.empty() || st.top() != -i.second) {
          cout << 0;
          return;
        }
        st.pop();
      }
    }
  }
  cout << ans;
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...