This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |