Submission #120442

#TimeUsernameProblemLanguageResultExecution timeMemory
120442tinderPort Facility (JOI17_port_facility)C++14
78 / 100
6147 ms918556 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; using ii = pair<int, int>; using info = pair<int, int>; #define x first #define id second #define v first #define w second const int maxn = 2e6 + 6; const int mod = 1e9 + 7; int n, s[maxn], t[maxn]; namespace graph { vector<ii> g[maxn]; void add_edge(int u, int v, int w) { g[u].emplace_back(v, w); g[v].emplace_back(u, w); } } using namespace graph; namespace merge_sort_tree { vector<info> ft[maxn << 2]; int ptr[maxn << 2]; // insert(t, {s, id}) void insert(int &i, info &j, int u = 1, int l = 1, int r = 2 * n) { ft[u].emplace_back(j); if(l == r) return; int m = l + r >> 1; if(i <= m) insert(i, j, u << 1, l, m); else insert(i, j, u << 1 | 1, m + 1, r); } // update on range [l, r] => over elems leq k: update(l, r, k, id) void update(int &i, int &j, int &k, int &id, int u = 1, int l = 1, int r = 2 * n) { // if(r < i or l > j or i > j) return; if(i <= l and r <= j) { while(ptr[u] < ft[u].size() and ft[u][ptr[u]].x <= k) ptr[u]++; if(ptr[u] and ft[u].size()) add_edge(id, ft[u][0].id, 1); return; } int m = l + r >> 1; if(m >= i) update(i, j, k, id, u << 1, l, m); if(m + 1 <= j) update(i, j, k, id, u << 1 | 1, m + 1, r); } // add n lg n edges calculated by update () void build(int u = 1, int l = 1, int r = 2 * n) { for(int j = 1; j < ptr[u]; j++) { add_edge(ft[u][j - 1].id, ft[u][j].id, 0); } if(l == r) return; int m = l + r >> 1; build(u << 1, l, m); build(u << 1 | 1, m + 1, r); } } using namespace merge_sort_tree; int vis[maxn]; int col[maxn]; void dfs(int u) { vis[u] = 1; for(ii &e : g[u]) { if(!vis[e.v]) { col[e.v] = col[u] ^ e.w; dfs(e.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[]) { scanf("%d", &n); vector<ii> tmp; for(int i = 1; i <= n; i++) { scanf("%d %d", &s[i], &t[i]); tmp.emplace_back(s[i], t[i]); } sort(tmp.begin(), tmp.end()); for(int i = 0; i < n; i++) { s[i + 1] = tmp[i].first; t[i + 1] = tmp[i].second; } for(int i = 1; i <= n; i++) { info j = {s[i], i}; insert(t[i], j); } for(int i = 1; i <= n; i++) { int x = s[i] + 1, y = t[i] - 1, z = s[i] - 1; if(x <= y) update(x, y, z, i); } build(); 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 merge_sort_tree::insert(int&, info&, int, int, int)':
port_facility.cpp:32:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = l + r >> 1;
           ~~^~~
port_facility.cpp: In function 'void merge_sort_tree::update(int&, int&, int&, int&, int, int, int)':
port_facility.cpp:40:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(ptr[u] < ft[u].size() and ft[u][ptr[u]].x <= k) ptr[u]++;
          ~~~~~~~^~~~~~~~~~~~~~
port_facility.cpp:43:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   } int m = l + r >> 1;
             ~~^~~
port_facility.cpp: In function 'void merge_sort_tree::build(int, int, int)':
port_facility.cpp:52:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = l + r >> 1;
           ~~^~~
port_facility.cpp: In function 'int main(int, const char**)':
port_facility.cpp:94:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
port_facility.cpp:97: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...