제출 #794291

#제출 시각아이디문제언어결과실행 시간메모리
794291Sohsoh84자리 배치 (IOI18_seats)C++17
0 / 100
2289 ms74756 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; typedef pair<int, int> pll; #define X first #define Y second #define all(x) (x).begin(), (x).end() #define sep ' ' #define debug(x) cerr << #x << ": " << x << endl; const int MAXN = 1e6 + 10; int n, m, R[MAXN], C[MAXN], k; namespace segment { pll sg[MAXN << 2]; int lz[MAXN << 2]; inline void init() { fill(sg, sg + (MAXN << 2), pll(0, 1)); } inline void push(int v) { sg[v].X += lz[v]; if ((v << 1 | 1) < (MAXN << 2)) { lz[v << 1] += lz[v]; lz[v << 1 | 1] += lz[v]; } lz[v] = 0; } inline pll merge(pll a, pll b) { if (a.X == b.X) return {a.X, a.Y + b.Y}; return min(a, b); } void update(int ql, int qr, int val, int l, int r, int v) { push(v); if (ql > r || qr < l) return; if (ql <= l && qr >= r) { lz[v] += val; push(v); return; } int mid = (l + r) >> 1; update(ql, qr, val, l, mid, v << 1); update(ql, qr, val, mid + 1, r, v << 1 | 1); sg[v] = merge(sg[v << 1], sg[v << 1 | 1]); } void update(int l, int r, int val) { if (r < l) return; r = min(r, k); update(l, r, val, 0, k, 1); } } vector<vector<int>> A; inline pll get(int i, int j, int d) { int r = numeric_limits<int>::max(); int l = -1; for (int a = 0; a < 2; a++) { for (int b = 0; b < 2; b++) { if (2 * a + b == d) l = A[i + a][j + b]; else r = min(r, A[i + a][j + b]); } } return {l, r - 1}; } inline void add(int i, int j, int z) { for (int a = 0; a < 2; a++) { for (int b = 0; b < 2; b++) { for (int d = 0; d < 4; d++) { auto [l, r] = get(i - a, j - b, d); segment::update(l, r, z); } } } } void give_initial_chart(int H_, int W_, vector<int> R_, vector<int> C_) { n = H_, m = W_; k = n * m; segment::init(); A.resize(n + 5); for (int i = 0; i < n + 5; i++) { A[i].resize(m + 5, MAXN); } for (int i = 0; i < k; i++) { R[i] = R_[i] + 1; C[i] = C_[i] + 1; A[R[i]][C[i]] = i; } for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) add(i, j, 1); } int swap_seats(int a, int b) { add(R[a], C[a], -1); add(R[b], C[b], -1); swap(A[R[a]][C[a]], A[R[b]][C[b]]); add(R[a], C[a], 1); add(R[b], C[b], 1); auto [mn, cnt] = segment::sg[1]; if (mn == 4) return cnt; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...