제출 #274828

#제출 시각아이디문제언어결과실행 시간메모리
274828SaboonLast supper (IOI12_supper)C++14
100 / 100
141 ms9700 KiB
#include "advisor.h" #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int last[maxn], nex[maxn]; bool mark[maxn], Good[2*maxn]; void ComputeAdvice(int *C, int N, int K, int M) { set<pair<int,int>> S; memset(last, 63, sizeof last); for (int i = N-1; i >= 0; i--){ nex[i] = last[C[i]]; last[C[i]] = i; } for (int i = 0; i < K; i++){ S.insert({-last[i], -(i+1)}); mark[i] = 1; } for (int i = 0; i < N; i++){ if (mark[C[i]]){ auto it = S.lower_bound(make_pair(-i,-maxn)); int idx = (*it).second; if (idx < 0) Good[-(idx+1)] = 1; else Good[idx+K] = 1; S.erase(it); S.insert({-nex[i], i}); } else{ auto it = S.begin(); int idx = (*it).second; if (idx < 0){ Good[-(idx+1)] = 0; mark[-(idx+1)] = 0; } else{ Good[idx+K] = 0; mark[C[idx]] = 0; } S.erase(it); mark[C[i]] = 1; S.insert({-nex[i], i}); } } for (int i = 0; i < N+K; i++) WriteAdvice(Good[i]); }
#include <bits/stdc++.h> #include "assistant.h" using namespace std; const int maxn = 1e5 + 10; bool mark2[maxn]; int C[maxn]; int A[2*maxn]; void Assist(unsigned char *S, int N, int K, int R) { set<int> Bad; for (int i = 0; i < R; i++) A[i] = S[i]; for (int i = 0; i < K; i++){ if (A[i] == 0) Bad.insert(i); mark2[i] = 1; } for (int i = 0; i < N; i++) { int req = GetRequest(); C[i] = req; if (mark2[req]){ if (A[i+K] == 0) Bad.insert(C[i]); continue; } assert(!Bad.empty()); int idx = *Bad.begin(); PutBack(idx); mark2[idx] = 0; mark2[C[i]] = 1; Bad.erase(Bad.begin()); if (A[i+K] == 0) Bad.insert(C[i]); } }
#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...