제출 #769299

#제출 시각아이디문제언어결과실행 시간메모리
769299Alihan_8자리 배치 (IOI18_seats)C++17
0 / 100
4059 ms55352 KiB
#include <bits/stdc++.h> //#include "seats.h" using namespace std; #define all(x) x.begin(), x.end() #define pb push_back #define ln '\n' //#define int long long template <class _T> bool chmin(_T &x, const _T &y){ bool flag = false; if ( x > y ){ x = y; flag |= true; } return flag; } template <class _T> bool chmax(_T &x, const _T &y){ bool flag = false; if ( x < y ){ x = y; flag |= true; } return flag; } const int inf = 1e9 + 1; struct MinSegTree{ vector <int> T; int N; void fix(vector <int> p){ int n = (int)p.size(); N = n; T.resize(n * 4 + 1); function <void(int,int,int)> build = [&](int v, int l, int r){ if ( l == r ){ T[v] = p[l]; return; } int md = (l + r) >> 1; build(v * 2, l, md), build(v * 2 + 1, md + 1, r); T[v] = min(T[v * 2], T[v * 2 + 1]); }; build(1, 0, N - 1); } void upd(int v, int l, int r, int pos, int val){ if ( l == r ){ T[v] = val; return; } int md = (l + r) >> 1; if ( pos <= md ){ upd(v * 2, l, md, pos, val); } else{ upd(v * 2 + 1, md + 1, r, pos, val); } T[v] = min(T[v * 2], T[v * 2 + 1]); } int get(int v, int l, int r, int tl, int tr){ if ( l > tr or r < tl ){ return inf; } if ( tl <= l and tr >= r ){ return T[v]; } int md = (l + r) >> 1; return min(get(v * 2, l, md, tl, tr), get(v * 2 + 1, md + 1, r, tl, tr)); } void upd(int pos, int val){ upd(1, 0, N - 1, pos, val); } int get(int l, int r){ return get(1, 0, N - 1, l, r); } }; vector <MinSegTree> T; int h, w; vector <vector<int>> p; vector <int> r, c; vector <array<int,4>> F; struct FenwSum{ vector <int> fenw; void fix(int n){ fenw.resize(n + 1, 0); } void upd(int i, int val){ i++; for (; i <= (int)fenw.size(); i += i & - i ){ fenw[i] += val; } } int get(int i){ int cnt = 0; ++i; for (; i > 0; i -= i & -i ){ cnt += fenw[i]; } return cnt; } int get(int l, int r){ return get(r) - get(l - 1); } } fenw; bool g(int i){ return ((F[i][1] - F[i][0] + 1) * (F[i][3] - F[i][2] + 1) == i + 1); } void upd(int i){ if ( !i ){ F[i][0] = F[i][1] = r[i]; F[i][2] = F[i][3] = c[i]; } else{ F[i][0] = min(F[i - 1][0], r[i]); F[i][1] = max(F[i - 1][1], r[i]); F[i][2] = min(F[i - 1][2], c[i]); F[i][3] = max(F[i - 1][3], c[i]); } fenw.upd(i, g(i)); } void give_initial_chart(int H, int W, vector<int> R, vector<int> C) { swap(r, R), swap(c, C); h = H, w = W; T.resize(h); p.resize(h); for ( auto &v: p ) v.resize(w); for ( int i = 0; i < h * w; i++ ){ p[r[i]][c[i]] = i; } for ( int i = 0; i < h; i++ ){ T[i].fix(p[i]); } F.resize(h * w); fenw.fix(h * w); for ( int i = 0; i < h * w; i++ ) upd(i); } int swap_seats(int a, int b) { for ( int i = a; i <= b; i++ ){ fenw.upd(i, -g(i)); } T[r[a]].upd(c[a], b); T[r[b]].upd(c[b], a); swap(r[a], r[b]), swap(c[a], c[b]); swap(p[r[a]][c[a]], p[r[b]][c[b]]); for ( int i = a; i <= b; i++ ) upd(i); return fenw.get(0, h * w - 1); } #ifndef EVAL /* 2 3 2 0 0 1 0 1 1 0 1 0 2 1 2 0 5 0 5 ANS: {3, 4} */ #include <cstdio> #include <cstdlib> #include <vector> namespace { int read_int() { int x; if (scanf("%d", &x) != 1) { fprintf(stderr, "Error while reading input\n"); exit(1); } return x; } } // namespace int main() { int H = read_int(); int W = read_int(); int Q = read_int(); std::vector<int> R(H * W), C(H * W); for (int i = 0; i < H * W; ++i) { R[i] = read_int(); C[i] = read_int(); } std::vector<int> A(Q), B(Q); for (int j = 0; j < Q; ++j) { A[j] = read_int(); B[j] = read_int(); } give_initial_chart(H, W, R, C); for (int j = 0; j < Q; ++j) { int answer = swap_seats(A[j], B[j]); printf("%d\n", answer); } return 0; } #endif // EVAL
#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...