Submission #431811

#TimeUsernameProblemLanguageResultExecution timeMemory
431811JeanBombeurJousting tournament (IOI12_tournament)C++17
100 / 100
68 ms5020 KiB
#include <iostream> #include <cstdio> #include <vector> using namespace std; // <|°_°|> const int INFINI = (1000 * 1000 * 1000); const int MAX_CHEVALIERS = (100 * 1000); const int LOG = (16); int NbVictoires[MAX_CHEVALIERS]; int Rang[MAX_CHEVALIERS]; int Next[MAX_CHEVALIERS]; int Fenwick[MAX_CHEVALIERS]; int FindNext(int a) { if (Rang[Next[a]] >= 0) return Next[a]; return Next[a] = FindNext(Next[a]); } void Add(int id, int val) { for (int i = id; i < MAX_CHEVALIERS; i |= (i + 1)) { Fenwick[i] += val; } return; } int FindFirst(int nb) { int ans = -1; int sum = 0; for (int i = (1 << LOG); i > 0; i >>= 1) { if (ans + i < MAX_CHEVALIERS && sum + Fenwick[ans + i] < nb) { ans += i; sum += Fenwick[ans]; } } return ans + 1; } int GetBestPosition(int nbChevaliers, int nbRounds, int nouvRang, int *Ranks, int *Left, int *Right) { for (int i = 0; i < nbChevaliers; i ++) { Next[i] = i + 1; Rang[i] = Ranks[i]; NbVictoires[i] = 0; Fenwick[i] = 1; } for (int i = 0; i < MAX_CHEVALIERS; i ++) { if ((i | (i + 1)) < MAX_CHEVALIERS) Fenwick[i | (i + 1)] += Fenwick[i]; } pair <int, int> ans = {0, 0}; for (int i = 0; i < nbRounds; i ++) { Left[i] ++, Right[i] ++; vector <int> pos; int first = FindFirst(Left[i]); for (int c = Left[i]; c <= Right[i]; c ++) { pos.push_back(first); first = FindNext(first); } int maxRang = -1; pair <int, int> maxDP = {- INFINI - 1, 0}; for (int a : pos) { if (a != pos.back()) maxRang = max(maxRang, Rang[a]); if (NbVictoires[a] > maxDP.first) maxDP = {NbVictoires[a], a}; } maxDP.first ++; if (maxRang > nouvRang) maxDP.first = - INFINI; Rang[maxDP.second] = max(maxRang, Rang[pos.back()]); NbVictoires[maxDP.second] = maxDP.first; for (int a : pos) { if (a != maxDP.second) { Rang[a] = -1; Add(a, -1); NbVictoires[a] = - INFINI; } } if (maxDP.first > ans.first || (maxDP.first == ans.first && maxDP.second < ans.second)) { ans = make_pair(maxDP.first, maxDP.second); } } return ans.second; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...