이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "seats.h"
#include <bits/stdc++.h>
#define F first
#define S second
#define pb push_back
#define all(x) x.begin(), x.end()
using namespace std;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int N = 1e6 + 10;
vi R, C;
int H, W;
vector<vi> A;
int GetMin(int l1, int r1, int l2, int r2){
int mn = H*W;
for(int i = l1; i < r1; i ++)
for(int j = l2; j < r2; j++)
mn = min(mn, A[i][j]);
return mn;
}
pii BadRange(int i, int j){
vector<pii> V;
V.pb({GetMin(0, i + 1, 0, j + 1), 0});
V.pb({GetMin(0, i + 1, j, W), 1});
V.pb({GetMin(i, H, 0, j + 1), 2});
V.pb({GetMin(i, H, j, W), 3});
sort(all(V));
if(3 - V[0].S == V[1].S) return {V[1].F, A[i][j]};
return {V[2].F, A[i][j]};
}
pii seg[N << 2];
int lz[N << 2];
void Apply(int id, int x){
lz[id] += x;
seg[id].F += x;
}
void Shift(int id){
Apply(id << 1, lz[id]);
Apply(id << 1 | 1, lz[id]);
lz[id] = 0;
}
void Build(int id = 1, int L = 0, int R = H * W){
seg[id] = {0, R - L};
lz[id] = 0;
if(L + 1 == R) return ;
int mid = (L + R) >> 1;
Build(id << 1, L, mid);
Build(id << 1 | 1, mid, R);
}
pii Merge(pii &A, pii &B){
if(A.F != B.F) return min(A, B);
return {A.F, A.S + B.S};
}
int Val[N];
void Add(int id, int l, int r, int x, int L = 0, int R = H * W){
for(int i = l; i < r; i++) Val[i] += x;
return ;
if(r <= L || R <= l) return ;
if(l <= L && R <= r){
Apply(id, x);
return ;
}
Shift(id);
int mid = (L + R) >> 1;
Add(id << 1, l, r, x, L, mid);
Add(id << 1 | 1, l, r, x, mid, R);
seg[id] = Merge(seg[id << 1], seg[id << 1 | 1]);
return ;
}
int Get0(){
int res = 0;
for(int i = 0; i < H*W; i++)
if(Val[i] == 0)
res ++;
return res;
}
void AddCell(int i, int j, int z){
pii ran = BadRange(i, j);
//cerr << "! " << i << ' ' << j << " " << ran.F << '\n';
if(ran.F < ran.S)
Add(1, ran.F, ran.S, z);
}
void give_initial_chart(int _H, int _W, vi _R, vi _C){
R = _R; C = _C;
H = _H; W = _W;
A.resize(H, vector<int> (W, 0));
for(int i = 0; i < H * W; i++)
A[R[i]][C[i]] = i;
Build();
for(int i = 0; i < H; i++)
for(int j = 0; j < W; j++)
AddCell(i, j, +1);
//cerr << seg[1].S << ' ' << "#########\n";
}
int swap_seats(int a, int b){
AddCell(R[a], C[a], -1);
AddCell(R[b], C[b], -1);
swap(R[a], R[b]);
swap(C[a], C[b]);
A[R[a]][C[a]] = a;
A[R[b]][C[b]] = b;
AddCell(R[a], C[a], +1);
AddCell(R[b], C[b], +1);
return Get0();
}
# | 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... |