# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
829947 | 2023-08-18T16:09:22 Z | MODDI | 최후의 만찬 (IOI12_supper) | C++14 | 0 ms | 0 KB |
#include <bits/stdc++.h> #include "advisor.h" using namespace std; #define pb push_back #define mp make_pair typedef long long ll; typedef vector<int> vi; typedef vector<ll> vl; typedef pair<int,int> pii; typedef pair<ll, ll> pll; int n; stack<int> G[100105]; set<pii> activasion; set<int> in_pq; vi advice, out; void ComputeAdvice(int *C, int N, int K, int M) { n = N; for(int i=n-1;i>=0;i--) G[C[i]].push(i); for(int i=0;i<K;i++){ int when=n+1; if(!G[i].empty()) when=G[i].top(); activasion.emplace(mp(when, i)); in_pq.insert(i); } for(int i = 0; i < n + K; i++) advice.pb(1); for(int i = 0; i < K; i++) out.pb(i); for(int i=0;i<n;i++){ G[C[i]].pop(); out[C[i]]=K+i; if(in_pq.find(C[i])==in_pq.end()){ pii sega =*activasion.begin(); activasion.erase(*activasion.begin()); in_pq.erase(sega.second); advice[out[sega.second]]=0; } int when=0; in_pq.emplace(C[i]); if(G[C[i]].empty()) when=n+1; else when=G[C[i]].top(); activasion.insert(mp(when, C[i])); } for(int i = 0; i < n+K; i++) WriteAdvice(advice[i]); }