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 "seats.h"
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct segment_tree {
int n;
vector<T> s;
T e;
function<T(T, T)> f;
segment_tree() {
}
segment_tree(int _n, T _e, function<T(T, T)> _f) : f(_f), e(_e) {
n = 2 << __lg(_n);
s.assign(2 * n - 1, e);
}
segment_tree(vector<T> &a, T _e, function<T(T, T)> _f) : segment_tree(a.size(), _e, _f) {
for (int i = 0; i < a.size(); i++) {
s[i + n - 1] = a[i];
}
for (int i = n - 2; i >= 0; i--) {
s[i] = f(s[i * 2 + 1], s[i * 2 + 2]);
}
}
void modify(int p, int l, int r, int x, const T v) {
if (l + 1 == r) {
s[p] = v;
return;
}
int m = (l + r + 1) / 2;
if (x < m) {
modify(p * 2 + 1, l, m, x, v);
} else {
modify(p * 2 + 2, m, r, x, v);
}
s[p] = f(s[p * 2 + 1], s[p * 2 + 2]);
}
void modify(int x, const T v) {
modify(0, 0, n, x, v);
}
T range_query(int p, int l, int r, int L, int R) {
if (R <= l || r <= L) {
return e;
}
if (L <= l && r <= R) {
return s[p];
}
int m = (l + r + 1) / 2;
return f(range_query(p * 2 + 1, l, m, L, R), range_query(p * 2 + 2, m, r, L, R));
}
T range_query(int l, int r) {
return range_query(0, 0, n, l, r);
}
};
int N, M;
vector<int> A, B;
segment_tree<int> SL, SR, SU, SD;
void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
N = H, M = W;
A = R, B = C;
SU = segment_tree<int>(A, N, [&](int x, int y) {return min(x, y);});
SL = segment_tree<int>(B, M, [&](int x, int y) {return min(x, y);});
SD = segment_tree<int>(A,-1, [&](int x, int y) {return max(x, y);});
SR = segment_tree<int>(A,-1, [&](int x, int y) {return max(x, y);});
}
int swap_seats(int u, int v) {
swap(A[u], A[v]);
swap(B[u], B[v]);
SU.modify(u, A[u]); SU.modify(v, A[v]);
SD.modify(u, A[u]); SD.modify(v, A[v]);
SL.modify(u, B[u]); SL.modify(v, B[v]);
SR.modify(u, B[u]); SR.modify(v, B[v]);
int ans = 0;
int U = A[0], D = A[0], L = B[0], R = B[0];
for (int i = 1; i <= N * M;) {
int s = (R - L + 1) * (D - U + 1);
if (s == i) {
ans++;
}
if (i == N * M) {
break;
}
if (s == i) {
U = min(U, A[i]);
D = max(D, A[i]);
L = min(L, B[i]);
R = max(R, B[i]);
i++;
} else {
U = SU.range_query(0, s);
D = SD.range_query(0, s);
L = SL.range_query(0, s);
R = SR.range_query(0, s);
i = s;
}
}
return ans;
}
Compilation message (stderr)
seats.cpp: In instantiation of 'segment_tree<T>::segment_tree(std::vector<_Tp>&, T, std::function<T(T, T)>) [with T = int]':
seats.cpp:60:71: required from here
seats.cpp:17:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
17 | for (int i = 0; i < a.size(); i++) {
| ~~^~~~~~~~~~
seats.cpp: In instantiation of 'segment_tree<T>::segment_tree(int, T, std::function<T(T, T)>) [with T = int]':
seats.cpp:16:91: required from 'segment_tree<T>::segment_tree(std::vector<_Tp>&, T, std::function<T(T, T)>) [with T = int]'
seats.cpp:60:71: required from here
seats.cpp:9:23: warning: 'segment_tree<int>::f' will be initialized after [-Wreorder]
9 | function<T(T, T)> f;
| ^
seats.cpp:8:7: warning: 'int segment_tree<int>::e' [-Wreorder]
8 | T e;
| ^
seats.cpp:12:5: warning: when initialized here [-Wreorder]
12 | segment_tree(int _n, T _e, function<T(T, T)> _f) : f(_f), e(_e) {
| ^~~~~~~~~~~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |