제출 #1269132

#제출 시각아이디문제언어결과실행 시간메모리
1269132proofy최솟값 배열 (IZhO11_hyper)C++20
100 / 100
337 ms98388 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long int n, m; struct node { int value; vector<node*> v; }; void input(node* a, int dimension) { if (dimension == 0) return void(cin >> a->value); a->v = vector<node*>(n); for (int i = 0; i < n; i++) input(a->v[i] = new node(), dimension - 1); } void output(node* a, int dimension) { if (dimension == 0) return void(cout << a->value << " "); for (int i = 0; i + m - 1 < n; i++) output(a->v[i], dimension - 1); } void shift(node* a, int dimension) { if (dimension == 1) return; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) swap(a->v[i]->v[j], a->v[j]->v[i]); for (int j = 0; j < n; j++) shift(a->v[j], dimension - 1); } void destroy(node* a) { if (!a) return; for (int i = 0; i < (int)a->v.size(); i++) destroy(a->v[i]); delete a; } const int N = 2e6 + 9; int b[N], dq[N], l, r; node* solve_1D_only(node* a, int dimension) { if (dimension == 1) { l = 0, r = -1; for (int i = 0; i < n; i++) { while (l <= r && dq[l] <= i - m) l += 1; while (l <= r && a->v[dq[r]]->value > a->v[i]->value) r -= 1; dq[++r] = i; if (i - m + 1 >= 0) b[i - m + 1] = a->v[dq[l]]->value; } for (int i = 0; i + m - 1 < n; i++) a->v[i]->value = b[i]; return a; } for (int i = 0; i < n; i++) a->v[i] = solve_1D_only(a->v[i], dimension - 1); return a; } node* solve(node* a, int dimension) { if (dimension == 1) return solve_1D_only(a, 1); for (int i = 0; i < n; i++) a->v[i] = solve(a->v[i], dimension - 1); shift(a, dimension); a = solve_1D_only(a, dimension); for (int i = 0; i < dimension - 1; i++) shift(a, dimension); return a; } const int D = 4; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; node* a = new node(); input(a, D); a = solve(a, D); output(a, D); }
#Verdict Execution timeMemoryGrader output
Fetching results...