(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

제출 #571594

#제출 시각아이디문제언어결과실행 시간메모리
571594elazarkorenSeats (IOI18_seats)C++17
100 / 100
3805 ms141528 KiB
#include <bits/stdc++.h> #define x first #define y second #define all(v) v.begin(), v.end() #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; const int MAX_N = 1e6 + 5; struct Seg { int n; vi seg, cnt, add; Seg() {} Seg(int m) { n = m; // for (n = 1; n < m; n <<= 1); seg.resize(4 * n); cnt.resize(4 * n); add.resize(4 * n); Init(1, 0, n); } void Init(int i, int l, int r) { cnt[i] = r - l; if (l + 1 == r) return; Init(i << 1, l, (l + r) >> 1), Init(i << 1 | 1, (l + r) >> 1, r); } inline int Val(int i) { return seg[i] + add[i]; } inline void push(int i) { add[i << 1] += add[i]; add[i << 1 | 1] += add[i]; seg[i] += add[i]; add[i] = 0; } inline void pull(int i) { int x1 = Val(i << 1), x2 = Val(i << 1 | 1); seg[i] = min(x1, x2); if (x1 == x2) { cnt[i] = cnt[i << 1] + cnt[i << 1 | 1]; } else if (x1 < x2) { cnt[i] = cnt[i << 1]; } else cnt[i] = cnt[i << 1 | 1]; } void update(int a, int b, int x, int i, int l, int r) { if (a <= l && r <= b) { add[i] += x; return; } if (r <= a || b <= l) return; push(i); update(a, b, x, i << 1, l, (l + r) >> 1); update(a, b, x, i << 1 | 1, (l + r) >> 1, r); pull(i); } inline void update(int a, int b, int x) { update(a, b, x, 1, 0, n); } }; int r[MAX_N], c[MAX_N]; vvi ind; //int ind[MAX_N]; Seg seg; int n; int h, w; inline void update(pii p1, pii p2, int x) { if (p1.x > p2.x) swap(p1.x, p2.x); if (p1.y > p2.y) swap(p1.y, p2.y); vi y(4); y[0] = p1.x < 0 || p1.y < 0 ? n : ind[p1.x][p1.y]; y[1] = p1.x < 0 ? n : ind[p1.x][p2.y]; y[2] = p1.y < 0 ? n : ind[p2.x][p1.y]; y[3] = ind[p2.x][p2.y]; sort(all(y)); seg.update(y[0], y[1], x); seg.update(y[2], y[3], x); } inline void update(pii p1, int x) { update({p1.x - 1, p1.y - 1}, p1, x); update({p1.x - 1, p1.y + 1}, p1, x); update({p1.x + 1, p1.y - 1}, p1, x); update({p1.x + 1, p1.y + 1}, p1, x); } void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { h = H, w = W; n = h * w; seg = Seg(n); ind.resize(h + 1, vi(w + 1)); for (int i = 0; i < n; i++) r[i] = R[i], c[i] = C[i]; for (int i = 0; i < n; i++) ind[r[i]][c[i]] = i; for (int i = 0; i <= w; i++) ind[h][i] = n; for (int i = 0; i <= h; i++) ind[i][w] = n; for (int i = 0; i <= h; i++) { for (int j = 0; j <= w; j++) { update({i - 1, j - 1}, {i, j}, 1); } } } int swap_seats(int a, int b) { // if (a > b) swap(a, b); update({r[a], c[a]}, -1), update({r[b], c[b]}, -1); swap(c[a], c[b]), swap(r[a], r[b]); ind[r[a]][c[a]] = a, ind[r[b]][c[b]] = b; update({r[a], c[a]}, 1), update({r[b], c[b]}, 1); return seg.cnt[1]; } //1 5 3 //0 2 //0 0 //0 3 //0 1 //0 4 //0 1 //2 4 //3 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...