Submission #795315

#TimeUsernameProblemLanguageResultExecution timeMemory
795315RushBWatermelon (INOI20_watermelon)C++17
100 / 100
65 ms27220 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define int int64_t const int64_t INF = 1ll << 60; const int N = 1e5 + 5; int b[N], in[N], nx[N], n, k, a[N]; vector<int> adj[N]; set<int> S; void rec(int i) { if (i == n + 1) { k--; if (!k) { FOR(i, 0, n) cout << a[i] << ' '; cout << '\n'; exit(0); } return; } if (!S.size()) return; auto it = S.begin(); while (it != S.end()) { int x = *it; S.erase(x); for (auto u: adj[x]) { in[u]--; if (!in[u]) S.insert(u); } a[x] = i; rec(i + 1); S.insert(x); for (auto u: adj[x]) { if (!in[u]) S.erase(u); in[u]++; } it = S.upper_bound(x); } } signed main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> k; FOR(i, 0, n) { cin >> b[i]; b[i] = (b[i] == -1 ? INF : b[i]); } vector<int> st; for (int i = n - 1; i >= 0; i--) { while (st.size() && b[st.back()] < b[i]) st.pop_back(); if (st.size() && b[i] != INF) { adj[i].push_back(st.back()); in[st.back()]++; } st.push_back(i); } for (int i = n - 1; i >= 0; i--) { if (b[i] == INF) { FOR(j, i + 1, n) { adj[j].push_back(i); in[i]++; if (b[j] == INF) break; } } else { if (nx[b[i] - 1]) { FOR(j, i + 1, nx[b[i] - 1] + 1) { adj[j].push_back(i); in[i]++; } } else if (b[i] > 1) { cout << -1; return 0; } nx[b[i]] = i; } } FOR(i, 0, n) if (!in[i]) S.insert(i); rec(1); cout << -1; } //11:28:05
#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...