이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "seats.h"
#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;
#define pb push_back
#define S second
#define F first
typedef pair<int, int> pii;
const int N = 1e6 + 200;
const int inf = (1 << 30);
const int dx[] = {0, -1, 0, -1};
const int dy[] = {0, 0, -1, -1};
int S, ans = 0;
int H, W;
int cur[10];
int **val, **was;
pii pos[N];
struct tree_line {
int t[N << 2], p[N << 2];
int cnt[N << 2];
void push(int v, int tl, int tr) {
if (p[v] != 0) {
if (tl != tr) {
p[v * 2] += p[v];
p[v * 2 + 1] += p[v];
}
t[v] += p[v];
p[v] = 0;
}
}
void build(int v = 1, int tl = 1, int tr = S) {
cnt[v] = tr - tl + 1;
if (tl == tr) return;
int tm = tl + tr >> 1;
build(v * 2, tl, tm);
build(v * 2 + 1, tm + 1, tr);
}
void out(int v = 1, int tl = 1, int tr = S) {
push(v, tl, tr);
if (tl == tr) {
cerr << t[v] << " ";
return;
}
int tm = tl + tr >> 1;
out(v * 2, tl, tm);
out(v * 2 + 1, tm + 1, tr);
t[v] = min(t[v * 2], t[v * 2 + 1]);
cnt[v] = 0;
if (t[v] == t[v * 2])
cnt[v] += cnt[v * 2];
if (t[v] == t[v * 2 + 1])
cnt[v] += cnt[v * 2 + 1];
}
void upd(int l, int r, int val, int v = 1, int tl = 1, int tr = S) {
if (l > r) return;
push(v, tl, tr);
if (l <= tl && tr <= r) {
p[v] += val;
push(v, tl, tr);
return;
}
if (r < tl || tr < l)
return;
int tm = tl + tr >> 1;
upd(l, r, val, v * 2, tl, tm);
upd(l, r, val, v * 2 + 1, tm + 1, tr);
t[v] = min(t[v * 2], t[v * 2 + 1]);
cnt[v] = 0;
if (t[v] == t[v * 2])
cnt[v] += cnt[v * 2];
if (t[v] == t[v * 2 + 1])
cnt[v] += cnt[v * 2 + 1];
}
int get() {
push(1, 1, S);
// cerr << "MN : " << t[1] << '\n';
return cnt[1];
}
} t;
void del(int _x, int _y) {
for (int j = 0, x, y; j < 4; ++j) {
x = _x - dx[j];
y = _y - dy[j];
if (was[x][y]) continue;
was[x][y] = 1;
for (int i = 0; i < 4; ++i)
cur[i] = val[x + dx[i]][y + dy[i]];
sort(cur, cur + 4);
t.upd(cur[0], cur[1] - 1, -1);
t.upd(cur[2], cur[3] - 1, -100);
}
}
void add(int _x, int _y) {
for (int j = 0, x, y; j < 4; ++j) {
x = _x - dx[j];
y = _y - dy[j];
if (was[x][y]) continue;
was[x][y] = 1;
for (int i = 0; i < 4; ++i)
cur[i] = val[x + dx[i]][y + dy[i]];
sort(cur, cur + 4);
t.upd(cur[0], cur[1] - 1, +1);
t.upd(cur[2], cur[3] - 1, +100);
}
}
void clr(int _x, int _y) {
for (int j = 0, x, y; j < 4; ++j) {
x = _x - dx[j];
y = _y - dy[j];
was[x][y] = 0;
}
}
void give_initial_chart(int _H, int _W, vector<int> R, vector<int> C) {
H = _H, W = _W;
S = H * W;
val = new int*[H + 5];
was = new int*[H + 5];
for (int i = 0; i <= H + 3; ++i) {
val[i] = new int[W + 5];
was[i] = new int[W + 5];
}
for (int i = 1; i <= S; ++i) {
C[i - 1]++, R[i - 1]++;
pos[i] = {R[i - 1], C[i - 1]};
val[R[i - 1]][C[i - 1]] = i;
}
t.build();
for (int i = 0; i <= W + 1; ++i)
val[0][i] = val[H + 1][i] = S + 1;
for (int i = 0; i <= H + 1; ++i)
val[i][0] = val[i][W + 1] = S + 1;
for (int i = 1; i <= H + 1; ++i) {
for (int j = 1; j <= W + 1; ++j) {
clr(i, j);
for (int k = 0; k < 4; ++k)
cur[k] = val[i + dx[k]][j + dy[k]];
sort(cur, cur + 4);
t.upd(cur[0], cur[1] - 1, +1);
t.upd(cur[2], cur[3] - 1, +100);
}
}
t.out();
return;
}
int swap_seats(int a, int b) {
++a, ++b;
del(pos[a].F, pos[a].S);
del(pos[b].F, pos[b].S);
clr(pos[a].F, pos[a].S);
clr(pos[b].F, pos[b].S);
swap(pos[a], pos[b]);
val[pos[a].F][pos[a].S] = a;
val[pos[b].F][pos[b].S] = b;
add(pos[a].F, pos[a].S);
add(pos[b].F, pos[b].S);
clr(pos[a].F, pos[a].S);
clr(pos[b].F, pos[b].S);
return t.get();
}
컴파일 시 표준 에러 (stderr) 메시지
seats.cpp: In member function 'void tree_line::build(int, int, int)':
seats.cpp:43:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
43 | int tm = tl + tr >> 1;
| ~~~^~~~
seats.cpp: In member function 'void tree_line::out(int, int, int)':
seats.cpp:54:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
54 | int tm = tl + tr >> 1;
| ~~~^~~~
seats.cpp: In member function 'void tree_line::upd(int, int, int, int, int, int)':
seats.cpp:75:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
75 | int tm = tl + tr >> 1;
| ~~~^~~~
# | 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... |