제출 #1269143

#제출 시각아이디문제언어결과실행 시간메모리
1269143proofy최솟값 배열 (IZhO11_hyper)C++20
100 / 100
369 ms98500 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int n, m;

const int N = 2e6 + 9;
int b[N], dq[N];
int* c[N];

void transform() { // 1D monostack
	int l = 0, r = -1;

	for (int i = 0; i < n; i++) {
		while (l <= r && dq[l] <= i - m) l += 1;
		while (l <= r && *c[dq[r]] > *c[i]) r -= 1;
		dq[++r] = i;

		if (i - m + 1 >= 0) b[i - m + 1] = *c[dq[l]];
	}

	for (int i = 0; i + m - 1 < n; i++) *c[i] = b[i];
}

struct node {
	int value;
	vector<node*> v;
};

void input(node* a, int d) {
	if (d == 0) return void(cin >> a->value);

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

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

	for (int i = 0; i + m - 1 < n; i++) output(a->v[i], d - 1);
}

void shift(node* a, int d) {
	if (d == 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], d - 1);
}

void shrink(node* a, int d) {
	if (d == 1) {
		for (int i = 0; i < n; i++) c[i] = &a->v[i]->value;
		return void(transform());
	}

	for (int i = 0; i < n; i++) 
		shrink(a->v[i], d - 1);
}

const int D = 4;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m;
	node* a = new node();

	input(a, D);
	for (int i = 0; i < D; i++) {
		shrink(a, D);
		shift(a, D);
	}
	output(a, D);
}
#Verdict Execution timeMemoryGrader output
Fetching results...