제출 #1269127

#제출 시각아이디문제언어결과실행 시간메모리
1269127proofy최솟값 배열 (IZhO11_hyper)C++20
0 / 100
409 ms327680 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) {
		cin >> a->value;
		return;
	}

	a->v = vector<node*>(n);
	for (int i = 0; i < n; i++) {
		a->v[i] = new node();
		input(a->v[i], dimension - 1);
	}
}

void output(node* a, int dimension) {
	if (dimension == 0) {
		cout << a->value << " ";
		return;
	}

	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);
}

node* solve_1D_only(node* a, int dimension) {
	if (dimension == 1) {
		deque<int> dq;
		node* b = new node();
		b->v = vector<node*>(n);
		for (int i = 0; i < n; i++)
			b->v[i] = new node();

		for (int i = 0; i < n; i++) {
			while (!dq.empty() && dq.front() <= i - m) 
				dq.pop_front();
			while (!dq.empty() && a->v[dq.back()]->value > a->v[i]->value) 
				dq.pop_back();

			dq.push_back(i);

			if (i - m + 1 >= 0) 
				b->v[i - m + 1]->value = a->v[dq.front()]->value;
		}
		return b;
	}

	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...