writing SCROLL
This commit is contained in:
78
src/main.cpp
78
src/main.cpp
@ -185,6 +185,7 @@ struct RawTeamDataType {
|
|||||||
kIntInf, kIntInf, kIntInf, kIntInf, kIntInf,
|
kIntInf, kIntInf, kIntInf, kIntInf, kIntInf,
|
||||||
kIntInf};
|
kIntInf};
|
||||||
int try_times_before_pass[26] = {0};
|
int try_times_before_pass[26] = {0};
|
||||||
|
int try_times_before_pass_before_block[26] = {0};
|
||||||
int submissions_during_block[26] = {0};
|
int submissions_during_block[26] = {0};
|
||||||
std::vector<SubmissionType> submissions;
|
std::vector<SubmissionType> submissions;
|
||||||
RawTeamDataType() { ; }
|
RawTeamDataType() { ; }
|
||||||
@ -298,6 +299,10 @@ inline void Submit(char problem_name, char *team_name,
|
|||||||
case kTLE: {
|
case kTLE: {
|
||||||
if (team_data[team_id].already_passed[problem_name - 'A'] == false) {
|
if (team_data[team_id].already_passed[problem_name - 'A'] == false) {
|
||||||
team_data[team_id].try_times_before_pass[problem_name - 'A']++;
|
team_data[team_id].try_times_before_pass[problem_name - 'A']++;
|
||||||
|
if (competition_status != kBlocked) {
|
||||||
|
team_data[team_id]
|
||||||
|
.try_times_before_pass_before_block[problem_name - 'A']++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -330,7 +335,76 @@ void FreezeScoreBoard() {
|
|||||||
competition_status = kBlocked;
|
competition_status = kBlocked;
|
||||||
write("[Info]Freeze scoreboard.\n");
|
write("[Info]Freeze scoreboard.\n");
|
||||||
}
|
}
|
||||||
void ScrollScoreBoard() { ; }
|
void PrintScoreBoard() {
|
||||||
|
for (auto it = score_board.begin(); it != score_board.end(); ++it) {
|
||||||
|
write(team_data[it->tid].name.c_str());
|
||||||
|
write(' ', team_data[it->tid].rank);
|
||||||
|
write(' ', it->score);
|
||||||
|
write(' ', it->penalty);
|
||||||
|
for (int i = 0; i < total_number_of_problems; i++) {
|
||||||
|
write(' ');
|
||||||
|
if (team_data[it->tid].is_frozen[i] == false) {
|
||||||
|
if (team_data[it->tid].already_passed_before_block[i]) {
|
||||||
|
write('+');
|
||||||
|
if (team_data[it->tid].try_times_before_pass[i] > 0)
|
||||||
|
write(team_data[it->tid].try_times_before_pass[i]);
|
||||||
|
} else {
|
||||||
|
if (team_data[it->tid].try_times_before_pass[i] > 0) {
|
||||||
|
write('-', team_data[it->tid].try_times_before_pass[i]);
|
||||||
|
} else
|
||||||
|
write('.');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int x = team_data[it->tid].try_times_before_pass_before_block[i];
|
||||||
|
if (x != 0) write('-');
|
||||||
|
write(x, '/', team_data[it->tid].submissions_during_block[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
write('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void ScrollScoreBoard() {
|
||||||
|
if (competition_status != kBlocked) {
|
||||||
|
write("[Error]Scroll failed: scoreboard has not been frozen.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
write("[Info]Scroll scoreboard.\n");
|
||||||
|
PrintScoreBoard();
|
||||||
|
auto it = score_board.end();
|
||||||
|
--it;
|
||||||
|
while (true) {
|
||||||
|
auto nxt = it;
|
||||||
|
--nxt;
|
||||||
|
auto nval = *nxt;
|
||||||
|
for (int i = 0; i < total_number_of_problems; i++) {
|
||||||
|
if (team_data[it->tid].is_frozen[i]) {
|
||||||
|
team_data[it->tid].is_frozen[i] = false;
|
||||||
|
team_data[it->tid].already_passed_before_block[i] =
|
||||||
|
team_data[it->tid].already_passed[i];
|
||||||
|
team_data[it->tid].try_times_before_pass_before_block[i] =
|
||||||
|
team_data[it->tid].try_times_before_pass[i];
|
||||||
|
team_data[it->tid].submissions_during_block[i] = 0;
|
||||||
|
if (team_data[it->tid].first_pass_time[i] < kIntInf) {
|
||||||
|
int score = it->score + 1;
|
||||||
|
team_data[it->tid].pass_time_before_freeze.insert(
|
||||||
|
team_data[it->tid].first_pass_time[i]);
|
||||||
|
int penalty = it->penalty + team_data[it->tid].first_pass_time[i] +
|
||||||
|
20 * team_data[it->tid].try_times_before_pass[i];
|
||||||
|
score_board.erase(it);
|
||||||
|
score_board.insert(ScoreBoredElementType(it->tid, score, penalty));
|
||||||
|
}
|
||||||
|
it=score_board.find(nval);
|
||||||
|
if(it==score_board.end()) goto finish_scroll;
|
||||||
|
goto next_round;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
it = nxt;
|
||||||
|
next_round:;
|
||||||
|
}
|
||||||
|
finish_scroll:;
|
||||||
|
competition_status = kNormalRunning;
|
||||||
|
PrintScoreBoard();
|
||||||
|
}
|
||||||
void QueryRanking(char *team_name) {
|
void QueryRanking(char *team_name) {
|
||||||
if (team_name_to_id.find(team_name) == team_name_to_id.end()) {
|
if (team_name_to_id.find(team_name) == team_name_to_id.end()) {
|
||||||
write("[Error]Query ranking failed: cannot find the team.\n");
|
write("[Error]Query ranking failed: cannot find the team.\n");
|
||||||
@ -459,8 +533,6 @@ inline void Excute(const char *const command) {
|
|||||||
int time;
|
int time;
|
||||||
sscanf(command, "%*s%s%*s%s%*s%s%*s%d", problem_name, team_name,
|
sscanf(command, "%*s%s%*s%s%*s%s%*s%d", problem_name, team_name,
|
||||||
submit_status, &time);
|
submit_status, &time);
|
||||||
fprintf(stderr,"command=%s\n",command);
|
|
||||||
fprintf(stderr,"tname=%s\n",team_name);
|
|
||||||
ICPCManager::API::Submit(problem_name[0], team_name, submit_status, time);
|
ICPCManager::API::Submit(problem_name[0], team_name, submit_status, time);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user