제출 #1354044

#제출 시각아이디문제언어결과실행 시간메모리
1354044kl0989eSwap (BOI16_swap)C++20
68 / 100
401 ms327680 KiB
#include <bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,fma")

#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()

int n;
vi a;
vector<vector<vi>> best;
vector<vi> nums;

void precalc(int cur) {
	if (cur!=1) {
		nums[cur]=nums[cur/2];
	}
	else {
		nums[cur].pb(a[cur]);
	}
	if (2*cur<=n) {
		nums[cur].pb(a[2*cur]);
	}
	if (2*cur+1<=n) {
		nums[cur].pb(a[2*cur+1]);
	}
	best[cur].resize(nums[cur].size());
	sort(all(nums[cur]));
	if (2*cur<=n) {
		precalc(2*cur);
	}
	if (2*cur+1<=n) {
		precalc(2*cur+1);
	}
}

void merge(int i, int t, int t1, int t2) {
	int j=0;
	int add=1;
	while (j<best[2*i][t1].size() || j<best[2*i+1][t2].size()) {
		int tj=j;
		while (tj<best[2*i][t1].size() && tj<j+add) {
			best[i][t].pb(best[2*i][t1][tj++]);
		}
		tj=j;
		while (tj<best[2*i+1][t2].size() && tj<j+add) {
			best[i][t].pb(best[2*i+1][t2][tj++]);
		}
		j+=add;
		add*=2;
	}
}

int dfs(int i, int val) {
	int ind=lower_bound(all(nums[i]),val)-nums[i].begin();
	if (best[i][ind].size()) {
		return ind;
	}
	if (2*i>n) {
		best[i][ind].pb(val);
		return ind;
	}
	if (2*i+1>n) {
		best[i][ind].pb(min(val,a[2*i]));
		best[i][ind].pb(max(val,a[2*i]));
		return ind;
	}
	best[i][ind].pb(min(val,min(a[2*i],a[2*i+1])));
	if (best[i][ind][0]==val) {
		int t1=dfs(2*i,a[2*i]);
		int t2=dfs(2*i+1,a[2*i+1]);
		merge(i,ind,t1,t2);
		return ind;
	}
	if (best[i][ind][0]==a[2*i]) {
		int t1=dfs(2*i,val);
		int t2=dfs(2*i+1,a[2*i+1]);
		merge(i,ind,t1,t2);
		return ind;
	}
	int t1=dfs(2*i,val);
	int t2=dfs(2*i+1,a[2*i]);
	merge(i,ind,t1,t2);
	vi t={min(val,min(a[2*i],a[2*i+1]))};
	swap(t,best[i][ind]);
	t1=dfs(2*i,a[2*i]);
	t2=dfs(2*i+1,val);
	merge(i,ind,t1,t2);
	for (int j=0; j<t.size(); j++) {
		if (t[j]!=best[i][ind][j]) {
			if (t[j]<best[i][ind][j]) {
				swap(t,best[i][ind]);
				return ind;
			}
			break;
		}
	}
	return ind;
}

int32_t main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
	cin >> n;
	a.resize(n+1);
	best.resize(n+1);
	nums.resize(n+1);
	for (int i=1; i<=n; i++) {
		cin >> a[i];
	}
	precalc(1);
	int t=dfs(1,a[1]);
	for (int i=0; i<n; i++) {
		cout << best[1][t][i] << " \n"[i==n];
	}
    return 0;
}
#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...