Ejemplo n.º 1
0
        /// <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;
            }
        }
Ejemplo n.º 2
0
 /// <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;
     }
 }