Пример #1
0
 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);
     }
 }
Пример #2
0
        // 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++;
                    }
                }
            }
        }