답안 #768599

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
768599 2023-06-28T09:44:26 Z parsadox2 Watermelon (INOI20_watermelon) C++14
0 / 100
20 ms 14232 KB
#include <bits/stdc++.h>
#define pb 		push_back
#define F		first
#define S 		second
#define debug(x)    cout << #x << "= " << x << ", "
#define ll 		long long
#define fast 		ios::sync_with_stdio(false), cin.tie(0),  cout.tie(0)
#define SZ(x)         (int) x.size()
#define wall 		cout << endl;
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int maxn = 1e5 + 10;
int n , k , ar[maxn] , deg[maxn] , C , fbi[maxn];
vector <int> adj[maxn];
set <int> cand;
vector <int> topol , ans;

void solve()
{
	if(cand.empty())
	{
		C++;
		if(C == k)
		{
			ans = topol;
		}
		return;
	}
	vector <int> tmp;
	for(auto v : cand)
	{
		tmp.pb(v);
		if(SZ(tmp) == k)
			break;
	}
	for(auto v : tmp)
	{
		cand.erase(v);
		topol.pb(v);
		for(auto u : adj[v])
		{
			deg[u]--;
			if(deg[u] == 0)
				cand.insert(u);
		}
		solve();
		if(C == k)
			break;
		for(auto u : adj[v])
		{
			deg[u]++;
			if(deg[u] == 1)  cand.erase(u);
		}
		cand.insert(v);
		topol.pop_back();
	}
}

int32_t main()
{
	fast;
	cin >> n >> k;
	for(int i = 1 ; i <= n ; i++)  cin >> ar[i];
	if(ar[n] != -1)
	{
		cout << -1 << endl;
		return 0;
	}
	vector <int> st;
	st.pb(n);
	bool ok = true;
	for(int i = n - 1 ; i > 0 ; i--)
	{
		int mx = 0;
		if(ar[i] == -1)
		{
			while(!st.empty())
			{
				auto now = st.back();
				adj[now].pb(i);
				deg[i]++;
				st.pop_back();
			}
			st.pb(i);
		}
		else
		{
			while(!st.empty())
			{
				auto now = st.back();
				if(ar[now] == -1 || ar[now] >= ar[i])
				{
					if(ar[i] != mx + 1)  ok = false;
					adj[i].pb(now);
					deg[now]++;
					break;
				}
				mx = max(mx , ar[now]);
				adj[now].pb(i);
				deg[i]++;
				st.pop_back();
			}
			st.pb(i);
		}
	}
	vector <int> vec;
	if(!ok)
	{
		cout << -1 << endl;
		return 0;
	}
	for(int i = 1 ; i <= n ; i++)  if(deg[i] == 0)  cand.insert(i);
	solve();
	if(C < k)
	{
		cout << -1 << endl;
		return 0;
	}
	for(int i = 0 ; i < n ; i++)
		fbi[ans[i]] = i + 1;
	for(int i = 1 ; i <= n ; i++)
		cout << fbi[i] << " ";
	cout << endl;
	return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Correct 1 ms 2644 KB Output is correct
3 Incorrect 1 ms 2644 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Correct 1 ms 2644 KB Output is correct
3 Incorrect 1 ms 2644 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 20 ms 14232 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 20 ms 14232 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Correct 1 ms 2644 KB Output is correct
3 Incorrect 1 ms 2644 KB Output isn't correct
4 Halted 0 ms 0 KB -