Submission #76082

#TimeUsernameProblemLanguageResultExecution timeMemory
76082arockSeats (IOI18_seats)C++14
33 / 100
1791 ms80548 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; int H, W; vector<int> R, C; struct seg { int min, ans; } tree[4 * 1000 * 1000]; vector<int> rev; int lazy[4 * 1000 * 1000]; seg merge(seg a, seg b) { if (a.min < b.min) { return a; } else if(b.min < a.min) { return b; } else { return {a.min, a.ans + b.ans}; } } seg build(int cur, int lo, int hi) { if (lo == hi) { return tree[cur] = {0, 1}; } int lmid = (lo + hi) / 2, rmid = lmid + 1; return merge(build(cur << 1 | 0, lo, lmid), build(cur << 1 | 1, rmid, hi)); } void update(int l, int r, int delta, int cur, int lo, int hi) { if (lo == l && hi == r) { lazy[cur] += delta; tree[cur].min += delta; } else { lazy[cur << 1 | 0] += lazy[cur]; tree[cur << 1 | 0].min += lazy[cur]; lazy[cur << 1 | 1] += lazy[cur]; tree[cur << 1 | 1].min += lazy[cur]; lazy[cur] = 0; int lmid = (lo + hi) / 2, rmid = lmid + 1; if (l <= lmid) { update(l, min(r, lmid), delta, cur << 1 | 0, lo, lmid); } if (r >= rmid) { update(max(l, rmid), r, delta, cur << 1 | 1, rmid, hi); } tree[cur] = merge(tree[cur << 1 | 0], tree[cur << 1 | 1]); } } void update(int l, int r, int delta) { update(l + 1, r, delta, 1, 1, H * W); } void give_initial_chart(int HH, int WW, vector<int> RR, vector<int> CC) { H = HH, W = WW, R = RR, rev = CC; C.resize(H * W + 2); C[0] = H * W; for (int i = 0; i < H * W; i++) { C[rev[i] + 1] = i; } C[H * W + 1] = H * W; build(1, 1, H * W); for (int i = 0; i <= H * W; i++) { update(min(C[i], C[i + 1]), max(C[i], C[i + 1]), +1); } } int swap_seats(int a, int b) { int ta = a, tb = b; a = rev[a] + 1, b = rev[b] + 1; update(min(C[a], C[a - 1]), max(C[a], C[a - 1]), -1); update(min(C[a], C[a + 1]), max(C[a], C[a + 1]), -1); update(min(C[b], C[b - 1]), max(C[b], C[b - 1]), -1); update(min(C[b], C[b + 1]), max(C[b], C[b + 1]), -1); swap(C[a], C[b]); swap(rev[ta], rev[tb]); update(min(C[a], C[a - 1]), max(C[a], C[a - 1]), +1); update(min(C[a], C[a + 1]), max(C[a], C[a + 1]), +1); update(min(C[b], C[b - 1]), max(C[b], C[b - 1]), +1); update(min(C[b], C[b + 1]), max(C[b], C[b + 1]), +1); return tree[1].min == 2? tree[1].ans : 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...