제출 #440970

#제출 시각아이디문제언어결과실행 시간메모리
440970prvocislo자리 배치 (IOI18_seats)C++17
0 / 100
316 ms48184 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; int r[maxn], c[maxn], num[maxn], val[maxn*2], cnt[maxn*2], lazy[maxn*2], nr, nc, n; void build(int l, int r, int vr = 0) { cnt[vr] = r-l+1; if (l == r) return; build(l, (l+r)/2, vr*2+1), build((l+r)/2+1, r, vr*2+2); } void update(int li, int ri, int v, int l, int r, int vr = 0) { if (ri < l || r < li) return; if (li <= l && r <= ri) { val[vr] += v, lazy[vr] += v; return; } update(li, ri, v, l, (l+r)/2, vr*2+1), update(li, ri, v, (l+r)/2+1, r, vr*2+2); val[vr] = min(val[vr*2+1], val[vr*2+2]), cnt[vr] = 0; if (val[vr] == val[vr*2+1]) cnt[vr] += cnt[vr*2+1]; if (val[vr] == val[vr*2+2]) cnt[vr] += cnt[vr*2+2]; val[vr] += lazy[vr]; } int id(int x, int y) { if (x < 0 || y < 0 || x >= nr || y >= nc) return nr*nc; return nc*x + y; } void change2x2(int x, int y, int d) { array<int, 4> a; for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) a[i*2+j] = num[id(x+i, y+j)]; sort(a.begin(), a.end()); for (int i = 0; i < 2; i++) if (a[i*2] < a[i*2+1]) update(a[i*2], a[i*2+1]-1, d, 0, n-1); } void change(int x, int y, int v) { for (int i = -1; i < 1; i++) for (int j = -1; j < 1; j++) change2x2(x+i, y+j, -1); num[x*nc+y] = v; for (int i = -1; i < 1; i++) for (int j = -1; j < 1; j++) change2x2(x+i, y+j, 1); } void give_initial_chart(int NR, int NC, vector<int> R, vector<int> C) { nr = NR, nc = NC, n = nr * nc; for (int i = 0; i < n; i++) { r[i] = R[i], c[i] = C[i]; num[r[i]*nc+c[i]] = i; } num[nr*nc] = n; for (int i = -1; i < nr; i++) for (int j = -1; j < nc; j++) change2x2(i, j, 1); build(0, n-1); } int swap_seats(int a, int b) { change(r[a], c[a], b); change(r[b], c[b], a); swap(r[a], r[b]), swap(c[a], c[b]); return cnt[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...