public AwardUtilities(Validator info, int penaltyTime) // Construct AwardUtilities with info from Validator { this._penaltyTime = penaltyTime; this.TeamRankInfos = new List <TeamRankInfo>(); this.FirstSolveInfos = new List <FirstSolveInfo>(); // Initialize teams and problems, make it empty foreach (var team in info.TeamsList) { TeamRankInfo teamInfoItem = new TeamRankInfo(team); teamInfoItem.SubmissionInfosBefore = new List <SubmissionInfo>(); teamInfoItem.SubmissionInfosAfter = new List <SubmissionInfo>(); foreach (var problem in info.ProblemsList) { SubmissionInfo submissionInfo = new SubmissionInfo(problem.id, problem.short_name, 0); SubmissionInfo submissionInfo1 = new SubmissionInfo(problem.id, problem.short_name, 0); teamInfoItem.SubmissionInfosBefore.Add(submissionInfo); teamInfoItem.SubmissionInfosAfter.Add(submissionInfo1); } teamInfoItem.AcceptCount = 0; teamInfoItem.Penalty = 0; TeamRankInfos.Add(teamInfoItem); } // Initialize first blood info foreach (var problem in info.ProblemsList) { FirstSolveInfo firstSolve = new FirstSolveInfo(); firstSolve.ProblemId = problem.id; firstSolve.Solved = false; firstSolve.TeamId = ""; this.FirstSolveInfos.Add(firstSolve); } }
// Enumerate submissions to calculate resolver data public void CalculateTeamResolverInfo(Validator info) { int contestLength = TimeInMinute(info.ContestInfo.duration), freezeLength = TimeInMinute(info.ContestInfo.scoreboard_freeze_duration); int contestBeforeFreezeLength = contestLength - freezeLength; foreach (var submission in info.SubmissionWithResultsList) { // Get current submission information: time, teamId, problemId, result, etc. int currentTime = TimeInMinute(submission.contest_time); string currentTeamId = submission.team_id; string currentProblemId = submission.problem_id; string currentJudgeResult = submission.judgeResult; int currentTeamRankInfoId = TeamRankInfos.FindIndex(x => x.id == currentTeamId); SubmissionInfo currentSubmissionInfoBefore = TeamRankInfos[currentTeamRankInfoId].SubmissionInfosBefore .Find(x => x.ProblemId == currentProblemId); SubmissionInfo currentSubmissionInfoAfter = TeamRankInfos[currentTeamRankInfoId].SubmissionInfosAfter .Find(x => x.ProblemId == currentProblemId); if (currentSubmissionInfoBefore == null || currentSubmissionInfoAfter == null) { throw new InvalidDataException(currentProblemId); } // Process first blood items bool problemSolvedStatus = this.FirstSolveInfos.First(x => x.ProblemId == currentProblemId).Solved; if (Accept.Contains(currentJudgeResult) && problemSolvedStatus == false) { this.FirstSolveInfos.First(x => x.ProblemId == currentProblemId).Solved = true; this.FirstSolveInfos.First(x => x.ProblemId == currentProblemId).TeamId = currentTeamId; if (currentTime < contestBeforeFreezeLength) { currentSubmissionInfoBefore.SubmissionStatus = "FB"; currentSubmissionInfoBefore.SubmissionTime = submission.contest_time; currentSubmissionInfoAfter.SubmissionStatus = currentSubmissionInfoBefore.SubmissionStatus; currentSubmissionInfoAfter.SubmissionTime = currentSubmissionInfoBefore.SubmissionTime; } else { currentSubmissionInfoAfter.SubmissionStatus = "FB"; currentSubmissionInfoAfter.SubmissionTime = submission.contest_time; } } // Process last accept: current result is accept and last result if reject if (Accept.Contains(currentJudgeResult) && Reject.Contains(currentSubmissionInfoAfter.SubmissionStatus)) { LastSolveTeamId = currentTeamId; } // Go through submissions before freeze if (currentTime < contestBeforeFreezeLength) { if (Accept.Contains(currentSubmissionInfoBefore.SubmissionStatus)) { continue; } currentSubmissionInfoBefore.SubmissionTime = submission.contest_time; currentSubmissionInfoBefore.SubmissionStatus = currentJudgeResult; if (Reject.Contains(currentJudgeResult)) { currentSubmissionInfoBefore.TryTime++; } // Make an copy to after status, so currentSubmissionInfoAfter always stands for latest AC? status currentSubmissionInfoAfter.SubmissionTime = currentSubmissionInfoBefore.SubmissionTime; currentSubmissionInfoAfter.TryTime = currentSubmissionInfoBefore.TryTime; currentSubmissionInfoAfter.SubmissionStatus = currentSubmissionInfoBefore.SubmissionStatus; } // Go through submissions after freeze else { if (Accept.Contains(currentSubmissionInfoAfter.SubmissionStatus)) { continue; } currentSubmissionInfoAfter.SubmissionTime = submission.contest_time; currentSubmissionInfoAfter.SubmissionStatus = currentJudgeResult; if (Reject.Contains(currentJudgeResult)) { currentSubmissionInfoAfter.TryTime++; } } } }