제출 #768635

#제출 시각아이디문제언어결과실행 시간메모리
768635parsadox2Watermelon (INOI20_watermelon)C++14
100 / 100
99 ms30552 KiB
#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) return; 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; } else if(ar[now] == mx) st.pop_back(); else { 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); if(k == 1) { int ps = 1; while(!cand.empty()) { auto now = *cand.begin(); fbi[now] = ps; cand.erase(now); ps++; for(auto u : adj[now]) { deg[u]--; if(deg[u] == 0) cand.insert(u); } } for(int i = 1 ; i <= n ; i++) cout << fbi[i] << " "; return 0; } 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; }
#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...