이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5, MOD = 1e9 + 7, INF = 1e9;
int n, cl[N], b[N], pos[N], t1[4 * N], t2[4 * N];
pair < int, int > a[N];
void build(int v, int l, int r){
if(l == r){
t1[v] = t2[v] = b[l];
return;
}
int mid = (r + l) >> 1;
build(v + v, l, mid);
build(v + v + 1, mid + 1, r);
t1[v] = max(t1[v + v], t1[v + v + 1]);
t2[v] = min(t2[v + v], t2[v + v + 1]);
}
void del(int v, int l, int r, int pos){
if(l == r){
t1[v] = -INF;
t2[v] = +INF;
return;
}
int mid = (r + l) >> 1;
if(pos <= mid){
del(v + v, l, mid, pos);
}
else{
del(v + v + 1, mid + 1, r, pos);
}
t1[v] = max(t1[v + v], t1[v + v + 1]);
t2[v] = min(t2[v + v], t2[v + v + 1]);
}
int get_min(int v, int l, int r, int tl, int tr){
if(l > r || l > tr || tl > r){
return +INF;
}
if(tl <= l && r <= tr){
return t2[v];
}
int mid = (r + l) >> 1;
return min(get_min(v + v, l, mid, tl, tr), get_min(v + v + 1, mid + 1, r, tl, tr));
}
int get_max(int v, int l, int r, int tl, int tr){
if(l > r || l > tr || tl > r){
return -INF;
}
if(tl <= l && r <= tr){
return t1[v];
}
int mid = (r + l) >> 1;
return max(get_max(v + v, l, mid, tl, tr), get_max(v + v + 1, mid + 1, r, tl, tr));
}
void dfs(int v, int color = 0){
cl[v] = color;
del(1, 1, 2 * n, a[v].first);
del(1, 1, 2 * n, a[v].second);
while(true){
int l = get_min(1, 1, 2 * n, a[v].first, a[v].second);
if(l >= a[v].first){
break;
}
int to = pos[l];
if(cl[to] != -1){
if(cl[to] != cl[v]){
cout << 0;
exit(0);
}
}
dfs(to, (color ^ 1));
}
while(true){
int r = get_max(1, 1, 2 * n, a[v].first, a[v].second);
if(r <= a[v].second){
break;
}
int to = pos[r];
if(cl[to] != -1){
if(cl[to] != cl[v]){
cout << 0;
exit(0);
}
}
dfs(to, (color ^ 1));
}
}
void check(){
vector < int > q[2];
for(int i = 1; i <= 2 * n; i++){
int x = pos[i];
if(i == a[x].first){
q[cl[x]].push_back(x);
}
else{
if(q[cl[x]].back() != x){
cout << 0;
exit(0);
}
q[cl[x]].pop_back();
}
}
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].first >> a[i].second;
}
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++){
int x = a[i].first, y = a[i].second;
b[x] = y;
b[y] = x;
pos[x] = pos[y] = i;
}
build(1, 1, 2 * n);
memset(cl, -1, sizeof(cl));
int ans = 1;
for(int i = 1; i <= n; i++){
if(cl[i] == -1){
dfs(i);
ans += ans;
if(ans >= MOD){
ans -= MOD;
}
}
}
check();
cout << ans;
}
# | 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... |