Submission #335060

#TimeUsernameProblemLanguageResultExecution timeMemory
335060limabeansSwap (BOI16_swap)C++17
100 / 100
289 ms28652 KiB
#include <bits/stdc++.h>
using namespace std;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;


const int maxn = 1e6 + 5;


int n;
int p[maxn];

map<pair<int,int>,int> dp;

int test(int i, int carry) {
    pair<int,int> key={i,carry};
    if (dp.count(key)) return dp[key];
    
    if (2*i>n) {
	return dp[key]=i;
    }
    if (2*i+1>n) {
	if (carry<p[2*i]) {
	    return dp[key]=i;
	} else {
	    return dp[key]=2*i;
	}
    }

    if (carry<min(p[2*i],p[2*i+1])) {
	return dp[key]=i;
    }
    if (p[2*i]<min(carry,p[2*i+1])) {
	return dp[key]=test(2*i,carry);
    }

    assert(p[2*i+1]<min(carry,p[2*i]));
    //obviously swap in p[2*i+1] into p[i]
    //but it's unclear if before getting to 2*i+1 we want to swap 2*i with i as well.
    int lo = min(carry,p[2*i]);
    if (test(2*i,lo)<test(2*i+1,lo)) {
	if (lo==carry) {
	    return dp[key]=test(2*i,carry);
	} else {
	    return dp[key]=test(2*i+1,carry);
	}
    } else {
	if (lo==carry) {
	    return dp[key]=test(2*i+1,carry);
	} else {
	    return dp[key]=test(2*i,carry);
	}
    }
}



void solve(int i) {
    if (2*i>n) {
	return;
    }
    if (2*i+1>n) {
	if (p[i]>p[2*i]) {
	    swap(p[i],p[2*i]);
	}
	return;
    }
    if (p[i]<min(p[2*i],p[2*i+1])) {
	// do nothing
    } else if (p[2*i]<min(p[i],p[2*i+1])) {
	swap(p[i],p[2*i]);
    } else {
	assert(p[2*i+1]<min(p[i],p[2*i]));

	int lo = min(p[i],p[2*i]);
	int hi = max(p[i],p[2*i]);
	
	p[i]=p[2*i+1];
	
	if (test(2*i,lo)<test(2*i+1,lo)) {
	    p[2*i]=lo;
	    p[2*i+1]=hi;
	} else {
	    p[2*i]=hi;
	    p[2*i+1]=lo;
	}
	
	
    }
    solve(i+1);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

    cin>>n;
    for (int i=1; i<=n; i++) {
	cin>>p[i];
    }


    solve(1);

    for (int i=1; i<=n; i++) {
	cout<<p[i]<<" ";
    }
    cout<<endl;    
    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...