Submission #288443

#TimeUsernameProblemLanguageResultExecution timeMemory
288443stoyan_malininLast supper (IOI12_supper)C++14
100 / 100
272 ms23800 KiB
#include "advisor.h" #include <set> #include <map> #include <queue> #include <vector> #include <iostream> using namespace std; namespace Advisor { const int MAXN = 1e5 + 5; int maxLog; int nxtSame[MAXN], firstSeen[MAXN]; vector <int> numSeq[MAXN]; void init(int n, int *a, int k) { for(int i = 0;i<k;i++) { for(int bit = 0;bit<=maxLog;bit++) numSeq[i].push_back(((i>>bit)&1)); } map <int, int> last; for(int i = 0;i<n;i++) { last[i] = n; firstSeen[i] = n; } for(int i = n-1;i>=0;i--) { nxtSame[i] = last[ a[i] ]; last[ a[i] ] = i; firstSeen[ a[i] ] = i; } } int calcLog(int x) { int ans = 0; while(x!=1) x /= 2, ans++; return ans; } template <class T> T getLast(set <T> &s) { auto it = s.end(); it--; return *it; } }; void ComputeAdvice(int *C, int N, int K, int M) { using namespace Advisor; maxLog = calcLog(K); init(N, C, K); set <pair <int, int>> s; vector <int> colorPos(N), scaffold(K); vector <int> activated(N, -1); for(int i = 0;i<N;i++) { colorPos[i] = -1; } for(int i = 0;i<K;i++) { scaffold[i] = i; colorPos[i] = i; s.insert({firstSeen[i], i}); } vector <int> outScaffold(K, 0), outArr(N, 0); for(int i = 0;i<N;i++) { //cout << " --- " << i << " --- " << '\n'; if(colorPos[ C[i] ]!=-1) { if(activated[ C[i] ]==-1) outScaffold[ C[i] ] = 1; else outArr[ activated[ C[i] ] ] = 1; activated[ C[i] ] = i; s.erase({i, colorPos[ C[i] ]}); s.insert({nxtSame[i], colorPos[ C[i] ]}); continue; } //for(pair <int, int> item: s) cout << item.first << " " << item.second << " || "; //cout << '\n'; pair <int, int> best = getLast(s); s.erase(best); //cout << best.first << " " << best.second << " -> " << scaffold[ best.second ] << '\n'; colorPos[ scaffold[best.second] ] = -1; scaffold[best.second] = C[i]; colorPos[ C[i] ] = best.second; //for(int bit: numSeq[best.second]) WriteAdvice(bit); s.insert({nxtSame[i], best.second}); activated[ C[i] ] = i; } //for(int x: outScaffold) cout << x << " "; //cout << '\n'; //for(int x: outArr) cout << x << " "; //cout << '\n'; for(int x: outScaffold) WriteAdvice(x); for(int x: outArr) WriteAdvice(x); }
#include "assistant.h" #include <set> #include <queue> #include <vector> #include <assert.h> #include <iostream> using namespace std; namespace Assitant { const int MAXN = 1e5 + 5; int maxLog; int calcLog(int x) { int ans = 0; while(x!=1) x /= 2, ans++; return ans; } struct Reader { queue <int> q; Reader(){} Reader(int n, unsigned char *a) { for(int i = 0;i<n;i++) this->q.push(int(a[i])); } int readInt(int log2) { int x = 0; for(int bit = 0;bit<=log2;bit++) { int d = q.front(); q.pop(); x += (d<<bit); } return x; } }; }; void Assist(unsigned char *A, int N, int K, int R) { vector <int> scaffoldActive(K), arrActive(N); for(int i = 0;i<K;i++) scaffoldActive[i] = A[i]; for(int i = 0;i<N;i++) arrActive[i] = A[i+K]; set <int> passive, scaffold; for(int i = 0;i<K;i++) { scaffold.insert(i); if(scaffoldActive[i]==0) passive.insert(i); } for(int iter = 0;iter<N;iter++) { int col = GetRequest(); if(scaffold.count(col)==true) { if(arrActive[iter]==0) passive.insert(col); continue; } //cout << "passive: "; //for(int x: passive) cout << x << " "; //cout << '\n'; assert(passive.empty()==false); int toRemove = *passive.begin(); scaffold.erase(toRemove); passive.erase(toRemove); PutBack(toRemove); scaffold.insert(col); if(arrActive[iter]==0) passive.insert(col); } }
#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...