답안 #242683

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
242683 2020-06-29T01:18:58 Z luciocf Swap (BOI16_swap) C++14
48 / 100
874 ms 262148 KB
#include <bits/stdc++.h>

#define ff first
#define ss second

using namespace std;

typedef pair<int, int> pii;

const int maxn = 2e5+10;
const int maxl = 35;

int a[maxn];

int pai[maxn];
int l[maxn], r[maxn];

vector<pii> dp[maxn][maxl];

map<int, int> anc[maxn];

void get_anc(int u)
{
	int ind = 0, v = u;

	while (v)
	{
		anc[u][a[v]] = ++ind;

		if (l[pai[v]] != v && l[pai[v]]) anc[u][a[l[pai[v]]]] = ++ind;

		v = pai[v];
	}
}

bool menor(vector<pii> a, vector<pii> b)
{
	if (!b.size()) return true;

	for (int i = 0; i < a.size(); i++)
	{
		if (a[i].ff < b[i].ff) return true;
		if (a[i].ff > b[i].ff) return false;
	}

	return true;
}

vector<pii> get(int u, int v, int f1, int x1, int f2, int x2)
{
	vector<pii> aux;
	aux.push_back({v, u});

	int ptr1 = 0, ptr2 = 0;
	int ind1 = anc[f1][x1], ind2 = anc[f2][x2];

	while (ptr1 < dp[f1][ind1].size() || ptr2 < dp[f2][ind2].size())
	{
		if (ptr1 == dp[f1][ind1].size())
		{
			aux.push_back(dp[f2][ind2][ptr2++]);
		}
		else if (ptr2 == dp[f2][ind2].size())
		{
			aux.push_back(dp[f1][ind1][ptr1++]);
		}
		else if (dp[f1][ind1][ptr1].ss < dp[f2][ind2][ptr2].ss)
		{
			aux.push_back(dp[f1][ind1][ptr1++]);
		}
		else
		{
			aux.push_back(dp[f2][ind2][ptr2++]);
		}
	}

	return aux;
}

void solve(int u, int v)
{
	if (!u || dp[u][anc[u][v]].size()) return;

	vector<pii> ans;

	int f1 = l[u], f2 = r[u];
	int x1 = a[f1], x2 = a[f2];

	solve(f1, x1); solve(f2, x2);

	vector<pii> aux = get(u, v, f1, x1, f2, x2);
	if (menor(aux, ans)) ans = aux;

	if (l[u] && r[u])
	{
		x1 = v, x2 = a[l[u]];

		solve(f1, x1); solve(f2, x2);

		aux = get(u, a[r[u]], f1, x1, f2, x2);
		if (menor(aux, ans)) ans = aux;
	}

	if (l[u])
	{
		x1 = v, x2 = a[r[u]];

		solve(f1, x1); solve(f2, x2);

		aux = get(u, a[l[u]], f1, x1, f2, x2);
		if (menor(aux, ans)) ans = aux;
	}

	if (r[u])
	{
		x1 = a[l[u]], x2 = v;

		solve(f1, x1); solve(f2, x2);

		aux = get(u, a[r[u]], f1, x1, f2, x2);
		if (menor(aux, ans)) ans = aux;
	}

	dp[u][anc[u][v]] = ans;
}

int main(void)
{
	int n;
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);

	for (int i = 1; i <= n; i++)
	{
		if (2*i <= n) l[i] = 2*i;

		if (2*i+1 <= n) r[i] = 2*i+1;

		pai[i] = i/2;
	}

	for (int i = 1; i <= n; i++)
		get_anc(i);

	solve(1, a[1]);

	for (auto x: dp[1][anc[1][a[1]]])
		printf("%d ", x.ff);
	printf("\n");
}

Compilation message

swap.cpp: In function 'bool menor(std::vector<std::pair<int, int> >, std::vector<std::pair<int, int> >)':
swap.cpp:40:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < a.size(); i++)
                  ~~^~~~~~~~~~
swap.cpp: In function 'std::vector<std::pair<int, int> > get(int, int, int, int, int, int)':
swap.cpp:57:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (ptr1 < dp[f1][ind1].size() || ptr2 < dp[f2][ind2].size())
         ~~~~~^~~~~~~~~~~~~~~~~~~~~
swap.cpp:57:44: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (ptr1 < dp[f1][ind1].size() || ptr2 < dp[f2][ind2].size())
                                       ~~~~~^~~~~~~~~~~~~~~~~~~~~
swap.cpp:59:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (ptr1 == dp[f1][ind1].size())
       ~~~~~^~~~~~~~~~~~~~~~~~~~~~
swap.cpp:63:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   else if (ptr2 == dp[f2][ind2].size())
            ~~~~~^~~~~~~~~~~~~~~~~~~~~~
swap.cpp: In function 'int main()':
swap.cpp:130:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
swap.cpp:133:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &a[i]);
   ~~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 174072 KB Output is correct
2 Correct 108 ms 174072 KB Output is correct
3 Correct 115 ms 174072 KB Output is correct
4 Correct 109 ms 174204 KB Output is correct
5 Correct 114 ms 174184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 174072 KB Output is correct
2 Correct 108 ms 174072 KB Output is correct
3 Correct 115 ms 174072 KB Output is correct
4 Correct 109 ms 174204 KB Output is correct
5 Correct 114 ms 174184 KB Output is correct
6 Correct 111 ms 174200 KB Output is correct
7 Correct 107 ms 174200 KB Output is correct
8 Correct 107 ms 174072 KB Output is correct
9 Correct 108 ms 174200 KB Output is correct
10 Correct 107 ms 174072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 174072 KB Output is correct
2 Correct 108 ms 174072 KB Output is correct
3 Correct 115 ms 174072 KB Output is correct
4 Correct 109 ms 174204 KB Output is correct
5 Correct 114 ms 174184 KB Output is correct
6 Correct 111 ms 174200 KB Output is correct
7 Correct 107 ms 174200 KB Output is correct
8 Correct 107 ms 174072 KB Output is correct
9 Correct 108 ms 174200 KB Output is correct
10 Correct 107 ms 174072 KB Output is correct
11 Correct 123 ms 175480 KB Output is correct
12 Correct 126 ms 175608 KB Output is correct
13 Correct 122 ms 175480 KB Output is correct
14 Correct 123 ms 175480 KB Output is correct
15 Correct 123 ms 175608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 174072 KB Output is correct
2 Correct 108 ms 174072 KB Output is correct
3 Correct 115 ms 174072 KB Output is correct
4 Correct 109 ms 174204 KB Output is correct
5 Correct 114 ms 174184 KB Output is correct
6 Correct 111 ms 174200 KB Output is correct
7 Correct 107 ms 174200 KB Output is correct
8 Correct 107 ms 174072 KB Output is correct
9 Correct 108 ms 174200 KB Output is correct
10 Correct 107 ms 174072 KB Output is correct
11 Correct 123 ms 175480 KB Output is correct
12 Correct 126 ms 175608 KB Output is correct
13 Correct 122 ms 175480 KB Output is correct
14 Correct 123 ms 175480 KB Output is correct
15 Correct 123 ms 175608 KB Output is correct
16 Runtime error 874 ms 262148 KB Execution killed with signal 9 (could be triggered by violating memory limits)
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 174072 KB Output is correct
2 Correct 108 ms 174072 KB Output is correct
3 Correct 115 ms 174072 KB Output is correct
4 Correct 109 ms 174204 KB Output is correct
5 Correct 114 ms 174184 KB Output is correct
6 Correct 111 ms 174200 KB Output is correct
7 Correct 107 ms 174200 KB Output is correct
8 Correct 107 ms 174072 KB Output is correct
9 Correct 108 ms 174200 KB Output is correct
10 Correct 107 ms 174072 KB Output is correct
11 Correct 123 ms 175480 KB Output is correct
12 Correct 126 ms 175608 KB Output is correct
13 Correct 122 ms 175480 KB Output is correct
14 Correct 123 ms 175480 KB Output is correct
15 Correct 123 ms 175608 KB Output is correct
16 Runtime error 874 ms 262148 KB Execution killed with signal 9 (could be triggered by violating memory limits)
17 Halted 0 ms 0 KB -