reach A-Class lowest line

This commit is contained in:
2023-10-14 18:14:05 +08:00
parent c466aa8508
commit 6c307d7982
3 changed files with 603680 additions and 14 deletions

300000
data/17.in Normal file

File diff suppressed because it is too large Load Diff

303638
data/17.out Normal file

File diff suppressed because it is too large Load Diff

View File

@ -178,7 +178,14 @@ struct RawTeamDataType {
int id; int id;
int rank; int rank;
int name_rank; int name_rank;
std::multiset<int, std::greater<int>> pass_time_before_freeze; // std::multiset<int, std::greater<int>> pass_time_before_freeze;
int pass_time_before_freeze[27] = {kIntInf, kIntInf, kIntInf, kIntInf,
kIntInf, kIntInf, kIntInf, kIntInf,
kIntInf, kIntInf, kIntInf, kIntInf,
kIntInf, kIntInf, kIntInf, kIntInf,
kIntInf, kIntInf, kIntInf, kIntInf,
kIntInf, kIntInf, kIntInf, kIntInf,
kIntInf, kIntInf, kIntInf};
int query_status_index[4], query_problem_index[26], int query_status_index[4], query_problem_index[26],
query_problem_status_index[26][4]; query_problem_status_index[26][4];
// as index in submissions are 0 based, so we use -1 to indicate that the team // as index in submissions are 0 based, so we use -1 to indicate that the team
@ -223,14 +230,15 @@ inline bool operator<(const ScoreBoredElementType &a,
// b.score); // b.score);
// throw str; // throw str;
// } // }
auto &TDA=team_data[a.tid]; auto &TDA = team_data[a.tid];
auto &TDB=team_data[b.tid]; auto &TDB = team_data[b.tid];
auto itae = TDA.pass_time_before_freeze.end(); auto &ta = TDA.pass_time_before_freeze;
auto itbe = TDB.pass_time_before_freeze.end(); auto &tb = TDB.pass_time_before_freeze;
for (auto ita = TDA.pass_time_before_freeze.begin(), int p = 0;
itb = TDB.pass_time_before_freeze.begin(); if (ta[p + 16] == kIntInf) p += 17;
ita != itae; ++ita, ++itb) { if (ta[p + 8] == kIntInf) p += 9;
if (*ita != *itb) return *ita < *itb; for (; p < 27; p++) {
if (ta[p] ^ tb[p]) return ta[p] < tb[p];
} }
return TDA.name_rank < TDB.name_rank; return TDA.name_rank < TDB.name_rank;
} }
@ -400,9 +408,19 @@ void FlushScoreBoard(bool show_info = true, bool rebuild = true) {
#endif #endif
score_board.erase(value_in_score_board[tid]); score_board.erase(value_in_score_board[tid]);
// team_data[tid].pass_time_before_freeze=team_data[tid].pass_time_before_freeze_new; // team_data[tid].pass_time_before_freeze=team_data[tid].pass_time_before_freeze_new;
for (int j : new_problems_accepted) for (int j : new_problems_accepted) {
team_data[tid].pass_time_before_freeze.insert( auto &pass_time_before_freeze = team_data[tid].pass_time_before_freeze;
team_data[tid].first_pass_time[j]); int p = 0;
int v = team_data[tid].first_pass_time[j];
for (; p < 26; p++) {
if (pass_time_before_freeze[p + 1] <= v) {
pass_time_before_freeze[p] = v;
break;
}
pass_time_before_freeze[p] = pass_time_before_freeze[p + 1];
}
if (p == 26) pass_time_before_freeze[26] = v;
}
score_board.insert(ScoreBoredElementType(tid, score, penalty)); score_board.insert(ScoreBoredElementType(tid, score, penalty));
value_in_score_board[tid] = ScoreBoredElementType(tid, score, penalty); value_in_score_board[tid] = ScoreBoredElementType(tid, score, penalty);
teams_not_latest[tid] = false; teams_not_latest[tid] = false;
@ -510,8 +528,18 @@ void ScrollScoreBoard() {
score_board.erase(it); score_board.erase(it);
// team_data[it->tid].pass_time_before_freeze=team_data[it->tid].pass_time_before_freeze_new; // team_data[it->tid].pass_time_before_freeze=team_data[it->tid].pass_time_before_freeze_new;
team_data[tid].acceptence_tracked[i] = true; team_data[tid].acceptence_tracked[i] = true;
team_data[tid].pass_time_before_freeze.insert( auto &pass_time_before_freeze =
team_data[tid].first_pass_time[i]); team_data[tid].pass_time_before_freeze;
int p = 0;
int v = team_data[tid].first_pass_time[i];
for (; p < 26; p++) {
if (pass_time_before_freeze[p + 1] <= v) {
pass_time_before_freeze[p] = v;
break;
}
pass_time_before_freeze[p] = pass_time_before_freeze[p + 1];
}
if (p == 26) pass_time_before_freeze[26] = v;
score_board.insert(ScoreBoredElementType(tid, score, penalty)); score_board.insert(ScoreBoredElementType(tid, score, penalty));
value_in_score_board[tid] = value_in_score_board[tid] =
ScoreBoredElementType(tid, score, penalty); ScoreBoredElementType(tid, score, penalty);