이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct segment_tree {
int n;
vector<T> s;
T e;
segment_tree() {
}
segment_tree(int _n) {
n = 2 << __lg(_n);
s.resize(2 * n - 1, T());
}
segment_tree(vector<T> &a) : segment_tree(a.size()) {
for (int i = 0; i < a.size(); i++) {
s[i + n - 1] = a[i];
}
for (int i = n - 2; i >= 0; i--) {
s[i] = 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] = 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 T();
}
if (L <= l && r <= R) {
return s[p];
}
int m = (l + r + 1) / 2;
return 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);
}
};
constexpr int inf = 1E9;
struct node {
int l, r, u, d;
node() : l(inf), r(-inf), u(inf), d(-inf) {
}
node(int L, int R, int U, int D) : l(L), r(R), u(U), d(D) {
}
int area() const {
return (r - l + 1) * (d - u + 1);
}
};
node operator+(const node &a, const node &b) {
return node(min(a.l, b.l), max(a.r, b.r), min(a.u, b.u), max(a.d, b.d));
}
int N, M;
vector<int> A, B;
segment_tree<node> S;
void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
N = H, M = W;
A = R, B = C;
vector<node> v(N * M);
for (int i = 0; i < N * M; i++) {
v[i] = node(B[i], B[i], A[i], A[i]);
}
S = segment_tree<node>(v);
}
int swap_seats(int u, int v) {
swap(A[u], A[v]);
swap(B[u], B[v]);
S.modify(u, node(B[u], B[u], A[u], A[u]));
S.modify(v, node(B[v], B[v], A[v], A[v]));
int ans = 0;
for (int i = 1; i <= N * M;) {
int s = S.range_query(0, i).area();
if (s == i) {
ans++;
i++;
} else {
i = s;
}
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
seats.cpp: In instantiation of 'segment_tree<T>::segment_tree(std::vector<_Tp>&) [with T = node]':
seats.cpp:77:29: required from here
seats.cpp:16:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<node, std::allocator<node> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
16 | for (int i = 0; i < a.size(); 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |