Submission #384199

#TimeUsernameProblemLanguageResultExecution timeMemory
384199pure_memSwap (BOI16_swap)C++14
68 / 100
38 ms4844 KiB
#include <bits/stdc++.h>

#define X first
#define Y second
#define MP make_pair
#define ll long long

using namespace std;

const int N = 2e5 + 12;
const int mod = 1e9 + 7;

int n, p[N];
map< pair<int, int>, int > dp;

int get(int v, int val){
	if(dp.count(MP(v, val)))
		return dp[MP(v, val)];
	if(val < min(p[v * 2], p[v * 2 + 1]))
		return v;
	if(p[v * 2] < p[v * 2 + 1])
		return dp[MP(v, val)] = get(v * 2, val);
	int mn = min(p[v * 2], val), mx = max(p[v * 2], mx);
	if(get(v * 2, mn) < get(v * 2 + 1, mn)){
		if(mn == val)
			return dp[MP(v, val)] = get(v * 2, val);
		else
			return dp[MP(v, val)] = get(v * 2 + 1, val); 	
	}
	else{
	    if(mn != val)
			return dp[MP(v, val)] = get(v * 2, val);
		else
			return dp[MP(v, val)] = get(v * 2 + 1, val);
	}
}

int main () {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	memset(p, 0x3f, sizeof(p));
	cin >> n;
	for(int i = 1;i <= n;i++)
		cin >> p[i];
    for(int i = 1;i <= n;i++){
    	if(p[i * 2 + 1] < min(p[i], p[i * 2])){
    		int mn = min(p[i], p[i * 2]), mx = max(p[i], p[i * 2]);
    		p[i] = p[i * 2 + 1], p[i * 2] = mx, p[i * 2 + 1] = mn;
    		if(get(i * 2, mn) < get(i * 2 + 1, mn))
    			p[i * 2] = mn, p[i * 2 + 1] = mx;
    	}
    	else if(p[i * 2] < p[i]){
    		swap(p[i], p[i * 2]);
    	}
    	cout << p[i] << " ";
    }
}                               
#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...