pla 5-backjun 16566カードゲーム


白駿16566カードゲーム
https://www.acmicpc.net/problem/16566
方法
これは,与えられた数で入力数よりも出力が大きいという問題であり,分離セットを用いて簡単に解決した.
に答える
現在所有しているカードはusable配列でtrue、falseで使用可能かどうかを表し、現在所有しているカードの中でインデックス値より大きい数を指すように400万個のcard配列をスケッチしています.そして、数字を入力しながら、merge再帰関数で利用可能な配列をチェックし、民秀が出せるカードを見つけ、カード配列の指示値を更新します.
コード#コード#
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int cards[4000001];
bool usable[4000001];
vector<int> select_cards;

int merge(int node)
{
	if (usable[cards[node]])
	{
		usable[cards[node]] = false;
		return cards[node];
	}

	return cards[node] = merge(cards[node]);
}

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

	int N, M, K;
	cin >> N >> M >> K;

	for (int i = 0; i < M; i++)
	{
		int temp;
		cin >> temp;
		select_cards.push_back(temp);
	}

	sort(select_cards.begin(), select_cards.end());

	int index = 1;
	for (int i = 0; i < select_cards.size(); i++)
	{
		int cur = select_cards[i];
		usable[cur] = true;

		while (index <= N) {

			if (index >= cur)
				break;
			cards[index] = cur;
			index++;
		}
	}

	while (K--)
	{
		int card_num;
		cin >> card_num;
		cout << merge(card_num) << '\n';
	}

	return 0;
}