제출 #242860

#제출 시각아이디문제언어결과실행 시간메모리
242860VEGAnnZagonetka (COI18_zagonetka)C++14
100 / 100
97 ms512 KiB
#include <bits/stdc++.h> #define PB push_back #define sz(x) ((int)x.size()) using namespace std; const int N = 110; vector<int> g[N], gr[N]; priority_queue<int, vector<int>, greater<int> > pq; priority_queue<int> PQ; int per[N], qur[N], mrk[N], in[N], n, loc[N], out[N]; bool was; void dfs(int v){ if (was) return; mrk[v] = 1; for (int u : g[v]){ if (was) return; if (mrk[u] == 0) dfs(u); else if (mrk[u] == 1){ was = 1; return; } } mrk[v] = 2; } void prit(){ for (int i = 1; i <= n; i++){ cout << qur[i]; if (i == n) cout << endl; else cout << " "; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef _LOCAL freopen("in.txt","r",stdin); #endif // _LOCAL cin >> n; for (int i = 1; i <= n; i++) { cin >> per[i]; loc[per[i]] = i; } for (int vl = 2; vl <= n; vl++) for (int pr = vl - 1; pr > 0; pr--){ gr[loc[pr]].PB(loc[vl]); g[loc[vl]].PB(loc[pr]); for (int i = 1; i <= n; i++) { qur[i] = per[i]; mrk[i] = 0; } was = 0; for (int i = pr; i <= vl && !was; i++){ if (mrk[loc[i]]) continue; dfs(loc[i]); } if (was){ gr[loc[pr]].pop_back(); g[loc[vl]].pop_back(); continue; } for (int i = pr; i <= vl; i++){ in[loc[i]] = 0; for (int u : gr[loc[i]]) if (per[u] >= pr) in[loc[i]]++; if (in[loc[i]] == 0) pq.push(loc[i]); } int cur = pr; while (sz(pq) > 0){ int v = pq.top(); pq.pop(); qur[v] = cur++; for (int u : g[v]){ if (per[u] < pr) continue; in[u]--; if (in[u] == 0) pq.push(u); } } cout << "query"; for (int i = 1; i <= n; i++) cout << " " << qur[i]; cout << endl; int res; cin >> res; gr[loc[pr]].pop_back(); g[loc[vl]].pop_back(); if (res == 0){ g[loc[pr]].PB(loc[vl]); gr[loc[vl]].PB(loc[pr]); } } cout << "end" << endl; for (int i = 1; i <= n; i++){ out[i] = sz(g[i]); if (out[i] == 0) PQ.push(i); } int cur = n; while (sz(PQ) > 0){ int v = PQ.top(); PQ.pop(); qur[v] = cur--; for (int u : gr[v]){ out[u]--; if (out[u] == 0) PQ.push(u); } } prit(); for (int i = 1; i <= n; i++){ in[i] = sz(gr[i]); if (in[i] == 0) PQ.push(i); } fill(qur + 1, qur + n + 1, -1); cur = 1; while (sz(PQ) > 0){ int v = PQ.top(); PQ.pop(); qur[v] = cur++; for (int u : g[v]){ in[u]--; if (in[u] == 0) PQ.push(u); } } prit(); 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...