제출 #1299197

#제출 시각아이디문제언어결과실행 시간메모리
1299197vako_pPort Facility (JOI17_port_facility)C++20
22 / 100
6094 ms32608 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll int 
#define pb push_back
#define ff first
#define sd second
#define debug(x) cerr << #x << " -----> " << x << endl;
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")

const int mxN = 1e6 + 5;
ll n,mod = 1e9 + 7,val[mxN];
pair<ll,ll> a[mxN];

struct ds{
  vector<ll> par;
  vector<vector<ll>> v;
  ll sz;
 
  void init(){
    sz = n;
    par.resize(n + 1);
    v.resize(n + 1);
    for(int i = 1; i <= n; i++){
      par[i] = i;
      v[i].pb(i);
    }
  }

  ll find(ll at){
    if(par[at] == at) return at;
    par[at] = find(par[at]);
    return par[at];
  }

  void merge(ll a, ll b){
    bool ok = (val[a] == val[b]);
    a = find(a);
    b = find(b);
    if(a == b){
      if(ok){
        cout << 0;
        exit(0);
      }
      return;
    }
    sz--;
    if(v[a].size() < v[b].size()) swap(a, b);
    par[b] = a;
    // if(v[a].size() > v[b].size()) swap(v[a], v[b]);
    for(auto it : v[b]){
      if(ok) val[it] = 1 - val[it]; 
      v[a].pb(it);
    }
    v[b].clear();
  }
};

struct segtree{
  vector<vector<ll>> v;
  ll sz = 1;

  void init(){
    while(sz < 2 * n + 5) sz *= 2;
    v.resize(2 * sz);
  }

  void set(ll l, ll r, ll val, ll x, ll lx, ll rx){
    if(lx >= r or rx <= l) return;
    if(lx >= l and rx <= r){
      v[x].pb(val);
      return;
    }
    ll mid = lx + (rx - lx) / 2;
    set(l, r, val, 2 * x + 1, lx, mid);
    set(l, r, val, 2 * x + 2, mid, rx);
  }

  void set(ll l, ll r, ll val){
    set(l, r, val, 0, 0, sz);
  }

  void find(ll i, vector<ll> &res, ll x, ll lx, ll rx){
    for(auto it : v[x]) res.pb(it);
    if(rx - lx == 1) return;
    ll mid = lx + (rx - lx) / 2;
    if(i < mid) find(i, res, 2 * x + 1, lx, mid);   
    else find(i, res, 2 * x + 2, mid, rx);
  }

  vector<ll> find(ll i, vector<ll> &res){
    find(i, res, 0, 0, sz);
    return res;
  }
};

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
  cin >> n; 
  for(int i = 1; i <= n; i++) cin >> a[i].ff >> a[i].sd;
  segtree s;
  s.init();
  ds ss;
  ss.init();
  sort(a + 1, a + n + 1);
  ll ans = 1;
  vector<ll> v;
  for(int i = n; i >= 1; i--){
    v.clear();
    s.find(a[i].sd, v);
    val[i] = 1;
    for(auto it : v) ss.merge(i, it);
    // for(auto it : v) cout << i << ' ' << it << '\n';
    if(a[i - 1].ff != a[i].ff){
      for(int j = i; j <= n and a[j].ff == a[i].ff; j++) s.set(a[j].ff + 1, a[j].sd, j);
    }
  }
  for(int i = 0; i < ss.sz; i++) ans = ans * 2 % mod;
  cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...