제출 #535852

#제출 시각아이디문제언어결과실행 시간메모리
535852LucaDantas자리 배치 (IOI18_seats)C++17
0 / 100
387 ms146480 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; constexpr int maxn = 1<<20; struct SegmentTree { int tree[maxn<<1], a[maxn], trash; bool op; // op = 0 -> min, op = 1 -> max SegmentTree(bool _op) : op(_op) { trash = _op == 0 ? maxn : -maxn; } int comb(int a, int b) { return ((a < b) ^ op) ? a : b; } void build(int node, int i, int j) { if(i == j) return (void)(tree[node] = a[i]); int m = (i+j) >> 1; build(node<<1, i, m); build(node<<1|1, m+1, j); tree[node] = comb(tree[node<<1], tree[node<<1|1]); } void upd(int node, int i, int j, int pos, int v) { if(i == j) return (void)(tree[node] = v); int m = (i+j) >> 1; if(pos <= m) upd(node<<1, i, m, pos, v); else upd(node<<1|1, m+1, j, pos, v); tree[node] = comb(tree[node<<1], tree[node<<1|1]); } int query(int node, int i, int j, int r) { if(i > r) return trash; if(j <= r) return tree[node]; int m = (i+j) >> 1; return comb(query(node<<1, i, m, r), query(node<<1|1, m+1, j, r)); } } R1(0), C1(0), R2(1), C2(1); int n, h, w; vector<int> r, c; void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { n = H*W; h = W, w = W; r = R, c = C; for(int i = 0; i < n; i++) R1.a[i] = R[i], R2.a[i] = R[i], C1.a[i] = C[i], C2.a[i] = C[i]; R1.build(1, 0, n-1); R2.build(1, 0, n-1); C1.build(1, 0, n-1); C2.build(1, 0, n-1); } int swap_seats(int a, int b) { swap(r[a], r[b]), swap(c[a], c[b]); for(int i = 0; i < 2; i++, swap(a, b)) { R1.upd(1, 0, n-1, a, r[a]); R2.upd(1, 0, n-1, a, r[a]); C1.upd(1, 0, n-1, a, c[a]); C2.upd(1, 0, n-1, a, c[a]); } int cnt = 0; int ans = 0, pos = 0; // printf("BASE %d\n", n); while(pos < n) { fflush(stdout); assert(++cnt < 10); int sz = (R2.query(1, 0, n-1, pos) - R1.query(1, 0, n-1, pos) + 1) * (C2.query(1, 0, n-1, pos) - C1.query(1, 0, n-1, pos) + 1); /* printf("%d -> ", pos); printf("%d %d | %d %d\n", R1.query(1, 0, n-1, pos), C1.query(1, 0, n-1, pos), R2.query(1, 0, n-1, pos), C2.query(1, 0, n-1, pos)); */ // printf("%d %d\n", pos, sz); if(pos == sz-1) ++ans, ++pos; else pos = sz-1; } return ans; }
#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...