Submission #136670

#TimeUsernameProblemLanguageResultExecution timeMemory
136670AlliancePort Facility (JOI17_port_facility)C++14
22 / 100
6145 ms940568 KiB
// In the Name of Allah #include<bits/stdc++.h> #define double long double typedef long long ll; const ll MAX_N = 2e6+100; const ll MOD = 1e9+7; using namespace std; vector<int> seg[MAX_N*3][2]; pair<int,int> lr[MAX_N]; int a[MAX_N]; int b[MAX_N]; int p[MAX_N]; vector<int> g[MAX_N]; vector<int> vc; int mark[MAX_N]; int cl[MAX_N]; int n,cnt; void no(){ cout << 0; exit(0); } void dfs(int v){ mark[v]++; for(auto x:g[v]){ if (mark[x]){ if (cl[x]==cl[v]) no(); } else{ cl[x] = 3-cl[v]; dfs(x); } } } void build(int k,int l,int r){ if (l==r){ if (a[l]) seg[k][0].push_back(a[l]); if (b[l]) seg[k][1].push_back(b[l]); return; } int mid = (l+r)/2; build(k*2,l,mid); build(k*2+1,mid+1,r); for(int i = 0;i<2;++i){ int lc = k*2; int rc = lc+1; seg[k][i].resize(seg[lc][i].size()+seg[rc][i].size()); merge(seg[lc][i].begin(),seg[lc][i].end(),seg[rc][i].begin(),seg[rc][i].end(),seg[k][i].begin()); } } void ask(int l,int r,int a,int b,int k,int fl){ if (r<a or b<l) return; if (a<=l and r<=b){ if (fl==0){ for(auto x:seg[k][0]){ if (x>=a) return; vc.push_back(x); } } else { for(int i = seg[k][1].size()-1;i>=0;--i){ int x = seg[k][1][i]; if (x<=b) return; vc.push_back(x); } } return; } int mid = (l+r)/2; ask(l,mid,a,b,k*2,fl); ask(mid+1,r,a,b,k*2+1,fl); } int main() { cin >> n; for(int i = 1;i<=n;++i) scanf("%d%d",&lr[i].first,&lr[i].second); for(int i = 1;i<=n;++i){ b[lr[i].first] = lr[i].second; a[lr[i].second] = lr[i].first; p[lr[i].second] = p[lr[i].first] = i; } build(1,1,2*n); for(int i = 1;i<=n;++i){ vc.clear(); ask(1,2*n,lr[i].first,lr[i].second,1,0); if (vc.size()){ sort(vc.begin(),vc.end()); for(int j = 0;j<vc.size()-1;j++) { int x = vc[j]; int y = vc[j+1]; if (b[y]>b[x]) no(); } for(auto x:vc) g[i].push_back(p[x]); } vc.clear(); ask(1,2*n,lr[i].first,lr[i].second,1,1); if (vc.size()){ sort(vc.begin(),vc.end()); for(int j = 0;j<vc.size()-1;j++){ int x = vc[j]; int y = vc[j+1]; if (a[y]>a[x]) no(); } } for(auto x:vc) g[i].push_back(p[x]); } for(int i = 1;i<=n;++i){ if (mark[i]) continue; cnt++; dfs(i); } ll ans = 1; while(cnt--) ans *= 2,ans %= MOD; cout << ans; return 0; }

Compilation message (stderr)

port_facility.cpp: In function 'int main()':
port_facility.cpp:101:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0;j<vc.size()-1;j++)
                           ~^~~~~~~~~~~~
port_facility.cpp:115:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0;j<vc.size()-1;j++){
                           ~^~~~~~~~~~~~
port_facility.cpp:89:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&lr[i].first,&lr[i].second);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...