제출 #1207922

#제출 시각아이디문제언어결과실행 시간메모리
1207922mychecksedadPort Facility (JOI17_port_facility)C++20
100 / 100
2327 ms412952 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;

struct Dsu{
  vector<int> p, s, sw;
  Dsu(int n){
    s.resize(n+1, 1);
    p.resize(n+1);
    sw.resize(n+1);
    for(int i = 1; i <= n; ++i){
      p[i] = i;
    }
  }
  int find(int v){
    if(p[v] == v) return v;
    return find(p[v]);
  }
  bool col(int v){
    if(p[v] == v) return 0;
    return col(p[v]) ^ sw[v];
  }
  void merge(int u, int v){
    if(u == v) return;
    int cl = col(u), clv = col(v);
    int a = find(u);
    int b = find(v);
    if(a != b){
      if(s[a] > s[b]) swap(a, b);
      s[b] += s[a];
      p[a] = b;
      if(cl == clv) sw[a] = 1;
      else sw[a] = 0;
    }
  }
} d(N);


int n, TT[8*N];
array<int, 2> a[N];
vi T[8*N];
void merg(int l, int r, int ql, int qr, int k, int v){
  if(ql > r || l > qr) return;
  if(ql <= l && r <= qr){
    // cerr << "merge: " << l << ' ' << r << '\n';
    // if(T[k].size()){
    //   cerr << d.col(T[k][0]) << ' ' << d.col(v) << '\n';
    //   cerr << T[k][0] << ' ' << v << '\n';
    // }
    if(T[k].size()){
      d.merge(T[k][0], v);
    }
    while(T[k].size() > 1){
      d.merge(T[k].back(), v);
      T[k].pop_back();
    }
    return;
  }
  int mid = l+r>>1;
  merg(l, mid, ql, qr, k<<1, v);
  merg(mid+1, r, ql, qr, k<<1|1, v);
}
void check(int l, int r, int ql, int qr, int k){
  if(ql > r || l > qr) return;
  if(ql <= l && r <= qr){
    // cerr << l << ' ' << r << ' ' << TT[k] << '\n';
    if(TT[k]){
      cout << 0;
      exit(0);
    }
    return;
  }
  int mid = l+r>>1;
  check(l, mid, ql, qr, k<<1);
  check(mid+1, r, ql, qr, k<<1|1);
}
void add(int l, int r, int p, int k, int v){
  T[k].pb(v);
  // cerr << l << ' ' << r << ' ' << v << '\n';
  if(l == r){
    return;
  }
  int mid = l+r>>1;
  if(p <= mid) add(l, mid, p, k<<1, v);
  else add(mid+1, r, p, k<<1|1, v);
}

void add2(int l, int r, int p, int k, int v){
  TT[k]++;
  // cerr << l << ' ' << r  << '\n';
  if(l == r){
    return;
  }
  int mid = l+r>>1;
  if(p <= mid) add2(l, mid, p, k<<1, v);
  else add2(mid+1, r, p, k<<1|1, v);
}
void solve(){
  cin >> n;
  for(int i = 1; i <= n; ++i){
    cin >> a[i][0] >> a[i][1];
  }
  sort(a+1, a+1+n);
  for(int i = 1; i <= n; ++i){
    add(1, n*2, a[i][1], 1, i);
    merg(1, n*2, a[i][0], a[i][1], 1, i);
  }

  // for(int i = 1; i <= n; ++i){
  //   cout << d.find(i) << ' ';
  // }
  // en;
  // for(int i = 1; i <= n; ++i){
  //   cout << d.col(i) << ' ';
  // }
  // en;

  for(int rep = 0; rep < 2; ++rep){
    for(int i = 1; i <= n*8; ++i){
      TT[i] = 0;
    }

    for(int i = 1; i <= n; ++i){
      if(d.col(i) == rep){
        check(1, n*2, a[i][0], a[i][1], 1);
        add2(1, 2*n, a[i][1], 1, i);
      }
    }
  }
  ll ans = 1;
  for(int i = 1; i <= n; ++i){
    if(d.find(i) == i) ans = 2*ans % MOD;
  }
  cout << ans;
}


int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  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...