From c466aa8508b4dcedb3d6542d03049ab8552052c1 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Sat, 14 Oct 2023 17:39:22 +0800 Subject: [PATCH] optimize < --- src/main.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e4071b3..4f4e66f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -211,6 +211,7 @@ struct ScoreBoredElementType { }; inline bool operator<(const ScoreBoredElementType &a, const ScoreBoredElementType &b) { + if (a.tid == b.tid) return false; if (a.score != b.score) return a.score > b.score; if (a.penalty != b.penalty) return a.penalty < b.penalty; // if (team_data[a.tid].pass_time_before_freeze.size() != @@ -222,19 +223,21 @@ inline bool operator<(const ScoreBoredElementType &a, // b.score); // throw str; // } - for (auto ita = team_data[a.tid].pass_time_before_freeze.begin(), - itb = team_data[b.tid].pass_time_before_freeze.begin(); - ita != team_data[a.tid].pass_time_before_freeze.end() && - itb != team_data[b.tid].pass_time_before_freeze.end(); - ++ita, ++itb) { + auto &TDA=team_data[a.tid]; + auto &TDB=team_data[b.tid]; + auto itae = TDA.pass_time_before_freeze.end(); + auto itbe = TDB.pass_time_before_freeze.end(); + for (auto ita = TDA.pass_time_before_freeze.begin(), + itb = TDB.pass_time_before_freeze.begin(); + ita != itae; ++ita, ++itb) { if (*ita != *itb) return *ita < *itb; } - return team_data[a.tid].name_rank < team_data[b.tid].name_rank; + return TDA.name_rank < TDB.name_rank; } // std::set score_board; __gnu_pbds::tree, __gnu_pbds::rb_tree_tag> -score_board; + score_board; std::vector teams_to_be_updated; std::vector teams_not_latest; std::vector value_in_score_board; @@ -295,7 +298,8 @@ void StartCompetition(int duration_time, int problem_count) { #endif } int cnt = 0; - for (auto it = score_board.begin(); it != score_board.end(); ++it) { + auto ite = score_board.end(); + for (auto it = score_board.begin(); it != ite; ++it) { team_data[it->tid].rank = ++cnt; } teams_to_be_updated.reserve(team_number + 1); @@ -410,7 +414,8 @@ void FlushScoreBoard(bool show_info = true, bool rebuild = true) { #endif } int cnt = 0; - for (auto it = score_board.begin(); it != score_board.end(); ++it) { + auto ite = score_board.end(); + for (auto it = score_board.begin(); it != ite; ++it) { team_data[it->tid].rank = ++cnt; } if (show_info) write("[Info]Flush scoreboard.\n"); @@ -424,7 +429,8 @@ void FreezeScoreBoard() { write("[Info]Freeze scoreboard.\n"); } void PrintScoreBoard() { - for (auto it = score_board.begin(); it != score_board.end(); ++it) { + auto ite = score_board.end(); + for (auto it = score_board.begin(); it != ite; ++it) { write(team_data[it->tid].name.c_str()); write(' ', team_data[it->tid].rank); write(' ', it->score);