/// <summary> /// 更新某用户某题的排名元素 /// </summary> /// <param name="user_id"></param> /// <param name="problem_id"></param> /// <param name="contest_id"></param> /// <param name="Type"></param> public static void UpdateSingleDetail(int user_id, int problem_id, int contest_id, Entity.ContestType Type) { using (Dal.DB db = new Dal.DB()) { Entity.StandingDetail detail = new Entity.StandingDetail(); detail.DisplayFormat = Type; switch (Type) { case Entity.ContestType.OI: { var r = Dal.RecordHelper.GetLastRecord(user_id, problem_id); if (r != null) { detail.FirstScore = r.Score.GetValueOrDefault(); detail.SecondScore = r.TimeUsage.GetValueOrDefault(); } break; } case Entity.ContestType.ACM: { var r = Dal.RecordHelper.GetFirstAcceptedRecord(user_id, problem_id); if (r != null) { detail.FirstScore = Dal.RecordHelper.GetEffectiveCount(user_id, problem_id, r.SubmissionTime); var BeginTime = (from c in db.Contests where c.ID == contest_id select c.StartTime).FirstOrDefault(); detail.SecondScore = Convert.ToInt32((r.SubmissionTime - BeginTime).TotalSeconds) + 60 * 20 * (detail.FirstScore - 1); } else { detail.FirstScore = Dal.RecordHelper.GetEffectiveCount(user_id, problem_id); detail.SecondScore = 0; } break; } case Entity.ContestType.TopCoder: { var r = Dal.RecordHelper.GetLastRecord(user_id, problem_id); if (r != null) { detail.RecordID = r.ID; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); if (r.Status == Entity.RecordStatus.Accepted) { int problem_pts = (from p in db.Problems where p.ID == problem_id select p.Score).FirstOrDefault(); DateTime BeginTime = (from pv in db.ProblemViews where pv.ProblemID == problem_id && pv.UserID == user_id select pv.Time).FirstOrDefault(); int seconds = (int)(r.SubmissionTime - BeginTime).TotalSeconds; int minutes = seconds / 60; detail.FirstScore = Convert.ToInt32(problem_pts * (1 - 0.004 * minutes * minutes)) - 50 * detail.ThirdScore; //Topcoder动态分数计算公式 if (detail.FirstScore < problem_pts * 0.3) { detail.FirstScore = (int)(problem_pts * 0.3); } detail.SecondScore = seconds; } } else { detail.FirstScore = 0; detail.SecondScore = 0; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); } break; } case Entity.ContestType.Codeforces: { var r = Dal.RecordHelper.GetLastRecord(user_id, problem_id); if (r != null) { detail.RecordID = r.ID; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); if (r.Status == Entity.RecordStatus.Accepted) { int problem_pts = (from p in db.Problems where p.ID == problem_id select p.Score).FirstOrDefault(); DateTime BeginTime = (from c in db.Contests where c.ID == contest_id select c.StartTime).FirstOrDefault(); int seconds = (int)(r.SubmissionTime - BeginTime).TotalSeconds; int minutes = seconds / 60; detail.FirstScore = Convert.ToInt32(problem_pts * (1 - 0.004 * minutes)) - 50 * detail.ThirdScore; //Codeforces动态分数计算公式 if (detail.FirstScore < problem_pts * 0.3) { detail.FirstScore = (int)(problem_pts * 0.3); } detail.SecondScore = seconds; } } else { detail.FirstScore = 0; detail.SecondScore = 0; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); } break; } } int userindex = (Standings[contest_id] as List <Entity.StandingItem>).FindIndex(x => x.UserID == user_id); (Standings[contest_id] as List <Entity.StandingItem>)[userindex].Details[FindProblem(problem_id, contest_id)] = detail; } }
/// <summary> /// 更新某用户某题的排名元素 /// </summary> /// <param name="user_id"></param> /// <param name="problem_id"></param> /// <param name="contest_id"></param> /// <param name="Type"></param> public static void UpdateSingleDetail(int user_id, int problem_id, int contest_id, Entity.ContestType Type) { using (Dal.DB db = new Dal.DB()) { Entity.StandingDetail detail = new Entity.StandingDetail(); detail.DisplayFormat = Type; switch (Type) { case Entity.ContestType.OI: { var r = Dal.RecordHelper.GetLastRecord(user_id, problem_id); if (r != null) { detail.FirstScore = r.Score.GetValueOrDefault(); detail.SecondScore = r.TimeUsage.GetValueOrDefault(); } break; } case Entity.ContestType.ACM: { var r = Dal.RecordHelper.GetFirstAcceptedRecord(user_id, problem_id); if (r != null) { detail.FirstScore = Dal.RecordHelper.GetEffectiveCount(user_id, problem_id, r.SubmissionTime); var BeginTime = (from c in db.Contests where c.ID == contest_id select c.StartTime).FirstOrDefault(); detail.SecondScore = Convert.ToInt32((r.SubmissionTime - BeginTime).TotalSeconds) + 60 * 20 * (detail.FirstScore - 1); } else { detail.FirstScore = Dal.RecordHelper.GetEffectiveCount(user_id, problem_id); detail.SecondScore = 0; } break; } case Entity.ContestType.TopCoder: { var r = Dal.RecordHelper.GetLastRecord(user_id, problem_id); if (r != null) { detail.RecordID = r.ID; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); if (r.Status == Entity.RecordStatus.Accepted) { int problem_pts = (from p in db.Problems where p.ID == problem_id select p.Score).FirstOrDefault(); DateTime BeginTime = (from pv in db.ProblemViews where pv.ProblemID == problem_id && pv.UserID == user_id select pv.Time).FirstOrDefault(); int seconds = (int)(r.SubmissionTime - BeginTime).TotalSeconds; int minutes = seconds / 60; detail.FirstScore = Convert.ToInt32(problem_pts * (1 - 0.004 * minutes * minutes)) - 50 * detail.ThirdScore;//Topcoder动态分数计算公式 if (detail.FirstScore < problem_pts * 0.3) detail.FirstScore = (int)(problem_pts * 0.3); detail.SecondScore = seconds; } } else { detail.FirstScore = 0; detail.SecondScore = 0; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); } break; } case Entity.ContestType.Codeforces: { var r = Dal.RecordHelper.GetLastRecord(user_id, problem_id); if (r != null) { detail.RecordID = r.ID; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); if (r.Status == Entity.RecordStatus.Accepted) { int problem_pts = (from p in db.Problems where p.ID == problem_id select p.Score).FirstOrDefault(); DateTime BeginTime = (from c in db.Contests where c.ID == contest_id select c.StartTime).FirstOrDefault(); int seconds = (int)(r.SubmissionTime - BeginTime).TotalSeconds; int minutes = seconds / 60; detail.FirstScore = Convert.ToInt32(problem_pts * (1 - 0.004 * minutes)) - 50 * detail.ThirdScore;//Codeforces动态分数计算公式 if (detail.FirstScore < problem_pts * 0.3) detail.FirstScore = (int)(problem_pts * 0.3); detail.SecondScore = seconds; } } else { detail.FirstScore = 0; detail.SecondScore = 0; detail.ThirdScore = Dal.RecordHelper.GetNoZeroPtsEffectiveCount(user_id, problem_id); } break; } } int userindex = (Standings[contest_id] as List<Entity.StandingItem>).FindIndex(x=>x.UserID == user_id); (Standings[contest_id] as List<Entity.StandingItem>)[userindex].Details[FindProblem(problem_id, contest_id)] = detail; } }