Submission #120383

#TimeUsernameProblemLanguageResultExecution timeMemory
120383tinderPort Facility (JOI17_port_facility)C++14
78 / 100
6094 ms466492 KiB
#include <bits/stdc++.h> using namespace std; using ii = pair<int, int>; const int maxn = 2e6 + 6; const int mod = 1e9 + 7; int n, s[maxn], t[maxn]; vector<int> g[maxn], w[maxn]; void add_edge(int u, int v, int col) { w[u].emplace_back(col); w[v].emplace_back(col); g[u].emplace_back(v); g[v].emplace_back(u); } struct info { int x, id; info () {} info (int _x, int _id) { x = _x, id = _id; } bool operator < (const info &that) const { return x < that.x; } }; vector<info> ft[maxn]; vector<int> p[maxn]; void insert(int i, info j) { for(; i <= (n << 1); i += i & -i) { ft[i].emplace_back(j); } } void update(int i, int l, int r, int id) { for(; i > 0; i -= i & -i) { int L = lower_bound(ft[i].begin(), ft[i].end(), info(l, 69)) - ft[i].begin(); int R = upper_bound(ft[i].begin(), ft[i].end(), info(r, 69)) - ft[i].begin(); if(R > L) { R--; p[i][L]++; p[i][R]--; add_edge(id, ft[i][L].id, 1); } } } int vis[maxn]; int col[maxn]; void dfs(int u) { vis[u] = 1; for(int i = 0; i < g[u].size(); i++) { int v = g[u][i], c = w[u][i]; if(!vis[v]) { col[v] = col[u] ^ c; dfs(v); } } } bool valid() { vector<int> id(2 * n + 5), op(2 * n + 5); for(int i = 1; i <= n; i++) { id[s[i]] = i, op[s[i]] = +1; id[t[i]] = i, op[t[i]] = -1; } vector<int> A, B; for(int i = 1; i <= (2 * n); i++) { if(op[i] == +1) { col[id[i]] ? A.push_back(id[i]) : B.push_back(id[i]); } else { vector<int> &w0t = col[id[i]] ? A : B; if(w0t.empty() or w0t.back() != id[i]) { return false; } else { w0t.pop_back(); } } } return true; } int main(int argc, char const *argv[]) { // freopen("in", "r", stdin); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d %d", &s[i], &t[i]); } for(int i = 1; i <= n; i++) { insert(s[i], info(t[i], i)); } for(int i = 1; i <= (n << 1); i++) { sort(ft[i].begin(), ft[i].end()); p[i].assign(ft[i].size(), 0); } for(int i = 1; i <= n; i++) { update(s[i] - 1, s[i] + 1, t[i] - 1, i); } for(int i = 1; i <= (n << 1); i++) { for(int j = 1; j < p[i].size(); j++) { p[i][j] += p[i][j - 1]; } for(int j = 0; j < (int)p[i].size() - 1; j++) { if(p[i][j]) { add_edge(ft[i][j].id, ft[i][j + 1].id, 0); } } } int ans = 1; for(int i = 1; i <= n; i++) { if(!vis[i]) { ans <<= 1; if(ans >= mod) { ans -= mod; } dfs(i); } } if(valid()) { printf("%d\n", ans); } else { puts("0"); } return 0; }

Compilation message (stderr)

port_facility.cpp: In function 'void dfs(int)':
port_facility.cpp:55:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[u].size(); i++) {
                 ~~^~~~~~~~~~~~~
port_facility.cpp: In function 'int main(int, const char**)':
port_facility.cpp:103:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 1; j < p[i].size(); j++) {
                  ~~^~~~~~~~~~~~~
port_facility.cpp:88:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
port_facility.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &s[i], &t[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...