이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define long long long
#define pii pair<int, int>
#define x first
#define y second
using namespace std;
const int N = 2e6 + 5;
const int M = 1e9 + 7;
class SegmentTree {
private:
pii t[N << 1];
public:
SegmentTree() {
fill_n(t, N << 1, pii(-M, -M));
}
void update(int x, pii k) {
for(t[x += N] = k; x != 1; x >>= 1)
t[x >> 1] = max(t[x], t[x ^ 1]);
}
pii query(int l, int r) {
pii ret(-M, -M);
for(l += N, r += N + 1; l < r; l >>= 1, r >>= 1) {
if(l & 1) ret = max(ret, t[l++]);
if(r & 1) ret = max(ret, t[--r]);
}
return ret;
}
} t_l, t_r;
int n;
int L[N], R[N], col[N];
void dfs(int u, int c) {
col[u] = c;
for(int _ = L[u] + 1; _ <= R[u] - 1; _++) {
auto [r, v] = t_l.query(L[u] + 1, R[u] - 1);
if(r > R[u]) {
t_l.update(L[v], {-M, -M});
t_r.update(R[v], {-M, -M});
dfs(v, c ^ 1);
} else break;
}
for(int _ = L[u] + 1; _ <= R[u] - 1; _++) {
auto [l, v] = t_r.query(L[u] + 1, R[u] - 1);
if(-l < L[u]) {
t_l.update(L[v], {-M, -M});
t_r.update(R[v], {-M, -M});
dfs(v, c ^ 1);
} else break;
}
}
int main() {
memset(col, -1, sizeof col);
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d %d", L + i, R + i);
--L[i], --R[i];
t_l.update(L[i], {R[i], i});
t_r.update(R[i], {-L[i], i});
}
long ans = 1;
for(int i = 0; i < n; i++) if(col[i] == -1) {
ans = ans * 2 % M;
t_l.update(L[i], {-M, -M});
t_r.update(R[i], {-M, -M});
dfs(i, 0);
}
bool ok = true;
for(int color = 0; color <= 1; color++) {
for(int i = 0; i < n; i++) {
if(col[i] == color) {
t_l.update(L[i], {R[i], i});
t_r.update(R[i], {-L[i], i});
} else {
t_l.update(L[i], {-M, -M});
t_r.update(R[i], {-M, -M});
}
}
for(int i = 0; i < n; i++) if(col[i] == color) {
int r = t_l.query(L[i] + 1, R[i] - 1).x;
int l = -t_r.query(L[i] + 1, R[i] - 1).x;
if(r > R[i] || l < L[i]) {
ok = false;
break;
}
}
}
if(ok) printf("%lld\n", ans);
else printf("0\n");
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
port_facility.cpp: In function 'int main()':
port_facility.cpp:62:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
62 | scanf("%d", &n);
| ~~~~~^~~~~~~~~~
port_facility.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
64 | scanf("%d %d", L + i, R + 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... |