제출 #1177878

#제출 시각아이디문제언어결과실행 시간메모리
1177878justinlgl20Port Facility (JOI17_port_facility)C++20
100 / 100
1415 ms274468 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define all(x) (x).begin(), (x).end() template<template<typename> class Container, typename G> ostream& operator<<(ostream& os, Container<G> x) { int f = 0; os << '{'; for (auto &i: x) os << (f++ ? ", " : ""), os << i; os << "}"; return os; } void _print() {cerr << "]\n";} template<typename T, typename... V> void _print(T t, V... v) {cerr << t; if (sizeof...(v)) cerr <<", "; _print(v...);} #ifdef DEBUG #define dbg(x...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<" [" << #x << "] = ["; _print(x); cerr << "\e[39m" << endl; #else #define dbg(x...) #endif #define pii pair<int, int> #define f first #define s second vector<int> adj[2000005]; set<int> adj2[2000005]; struct dsu{ vector<int> p; dsu(int n) : p(n+3,-1) {} int rep(int u){ if(p[u]<0)return u; return p[u]=rep(p[u]); } void merge(int a,int b){ a=rep(a),b=rep(b); if(a==b)return; if(p[a]<p[b]) swap(a,b); p[b]+=p[a]; p[a]=b; } }; int col[2000005]; void dfs(int u,int c){ col[u]=c; int x=(c+1==3?1:c+1); for(int i : adj[u]){ if(col[i]!=0){ assert(col[i]==x); } else { col[i]=x; dfs(i,x); } } } const int MOD = 1000000007; int32_t main() { int n;cin>>n; vector<vector<int>>a(n,vector<int>()); for(int i=0;i<n;i++){ int b,c;cin>>b>>c; a[i].push_back(b); a[i].push_back(c); } dbg("HI"); dsu d(2*n); sort(all(a)); dbg(a); map<int,int> pos; for(int i=0;i<n;i++){ auto inx=pos.lower_bound(a[i][0]); auto fin=pos.upper_bound(a[i][1]); if(inx!=fin and fin!=pos.begin()){ fin--; while(inx!=pos.end()){ d.merge(i,(inx->s)+n); d.merge(i+n,(inx->s)); if(inx==fin or d.rep(fin->s)==d.rep(inx->s))break; inx++; } } pos[a[i][1]]=i; } for(int i=0;i<n;i++){ if(d.rep(i)==d.rep(n+i)){ cout<<"0\n";return 0; } } // i is on the same side as n+1 int an=1; for(int i=0;i<n;i++){ if(i==d.rep(i)){ an*=2ll; an%=MOD; //dfs(x, 1); } } cout<<an<<"\n"; return 0; // each end is connected to stuff so we merge the edges // i is where node i is and i+n is end of i vector<int>ans(2*n); for(int i=0;i<n;i++){ ans[a[i][0]] = col[i]; ans[a[i][1]] = col[i]; dbg(i, col[i], a[i]); } for(int i=0;i<2*n;i++){ cout<<ans[i]<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...