Exemplo n.º 1
0
        public static bool _Rehack(int id)
        {
            Database.DB DbContext = new Database.DB();
            var         hack      = DbContext.Hacks.Find(id);
            var         status    = hack.Status;
            var         problem   = status.Problem;
            var         contest   = problem.Contest;

            if (status.Result == Entity.JudgeResult.Hacked)
            {
                DbContext.TestCases.Remove(status.JudgeTasks.Last().TestCase);
                DbContext.SaveChanges();
                status.Result = status.JudgeTasks.Max(x => x.Result);
                DbContext.SaveChanges();
            }
            var group = SignalR.JudgeHub.GetNode();

            hack.Result = Entity.HackResult.Pending;
            DbContext.SaveChanges();
            if (group == null)
            {
                return(false);
            }
            SignalR.JudgeHub.context.Clients.Group(group).Hack(new Judge.Models.HackTask(hack));
            SignalR.JudgeHub.ThreadBusy(group);
            hack.Result = Entity.HackResult.Running;
            DbContext.SaveChanges();
            return(true);
        }
Exemplo n.º 2
0
 public static bool IsUserInPrivateContest(Entity.User user, Entity.Contest contest)
 {
     if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End)
         return true;
     if (string.IsNullOrEmpty(contest.Password))
         return true;
     if (user == null)
         return false;
     var joinlog = contest.JoinLogs.Where(x => x.UserID == user.ID).FirstOrDefault();
     if (joinlog == null)
     {
         if (user.Role >= Entity.UserRole.Master || (from cm in contest.Managers select cm.UserID).Contains(user.ID))
         {
             Database.DB DbContext = new Database.DB();
             DbContext.JoinLogs.Add(new Entity.JoinLog
             {
                 ContestID = contest.ID,
                 UserID = user.ID
             });
             DbContext.SaveChanges();
             return true;
         }
         else
         {
             return false;
         }
     }
     return true;
 }
Exemplo n.º 3
0
 public static void ThreadBusy(string JudgerName)
 {
     var index = Online.FindIndex(x => x.Username == JudgerName);
     if (index >= 0)
     {
         Online[index].CurrentThreads++;
         Database.DB DbContext = new Database.DB();
         var username = Online[index].Username;
         var user = (from u in DbContext.Users where u.Username == username select u).Single();
         SignalR.CodeCombHub.context.Clients.Group("System Judge").onJudgerStatusChanged(new Models.View.Judger(user, Online[index]));
     }
 }
Exemplo n.º 4
0
        public static void PushToAll(string Message)
        {
            Database.DB DbContext    = new Database.DB();
            var         devicetokens = (from dt in DbContext.DeviceTokens
                                        where dt.TypeAsInt == (int)Entity.DeviceType.iOS
                                        select dt).ToList();

            foreach (var dt in devicetokens)
            {
                iOS_PushTo(dt.Token, Message);
            }
        }
Exemplo n.º 5
0
        public static void ThreadBusy(string JudgerName)
        {
            var index = Online.FindIndex(x => x.Username == JudgerName);

            if (index >= 0)
            {
                Online[index].CurrentThreads++;
                Database.DB DbContext = new Database.DB();
                var         username  = Online[index].Username;
                var         user      = (from u in DbContext.Users where u.Username == username select u).Single();
                SignalR.CodeCombHub.context.Clients.Group("System Judge").onJudgerStatusChanged(new Models.View.Judger(user, Online[index]));
            }
        }
Exemplo n.º 6
0
        public static void RatingDelete(int id)
        {
            var DbContext   = new Database.DB();
            var old_ratings = (from r in DbContext.Ratings
                               where r.ContestID == id
                               select r).ToList();

            foreach (var r in old_ratings)
            {
                DbContext.Ratings.Remove(r);
            }
            DbContext.SaveChanges();
        }
 public IActionResult Index()
 {
     using (var db = new Database.DB())
     {
         var model = db.Categories.OrderBy(c => c.Name).
                     Select(c => new CategoryModel()
         {
             Id   = c.Id,
             Name = c.Name,
         })
                     .ToList();
         return(base.View(model));
     }
 }
        public IActionResult Create(CategoryModel model)
        {
            if (ModelState.IsValid)
            {
                using (var db = new Database.DB())
                {
                    db.Categories.Add(new Database.Categories()
                    {
                        Name = model.Name,
                    });
                    db.SaveChanges();
                }

                return(RedirectToAction(nameof(Index)));
            }
            return(View(model));
        }
Exemplo n.º 9
0
 //contest id
 public static List<Models.View.Standing> Build(int id)
 {
     Database.DB db = new Database.DB();
     List<Models.View.Standing> standings = new List<Models.View.Standing>();
     var contest = db.Contests.Find(id);
     var users = (from s in db.Statuses
                  let pid = (from p in db.Problems
                             where p.ContestID == contest.ID
                             select p.ID).ToList()
                  where pid.Contains(s.ProblemID)
                  && s.Time >= contest.Begin
                  && s.Time < contest.End
                  select s.User).Distinct().ToList();
     foreach (var user in users)
         standings.Add(new Models.View.Standing(user, contest));
     Sort(contest.Format, ref standings);
     return standings;
 }
Exemplo n.º 10
0
        public static void Update(int user_id,int contest_id, ref List<Models.View.Standing> standings)
        {
            Database.DB db = new Database.DB();
            var user = db.Users.Find(user_id);
            var contest = db.Contests.Find(contest_id);
            var index = standings.FindIndex(x => x.UserID == user_id);
            var new_standing = new Models.View.Standing(user, contest);
            if (index < 0)
            {
                standings.Add(new_standing);
            }
            else
            {
                standings[index] = new_standing;
            }
            Sort(contest.Format, ref standings);

            //推送排名变化
            SignalR.CodeCombHub.context.Clients.All.onStandingChanged(contest_id, new_standing);
        }
Exemplo n.º 11
0
        public static List <Models.View.Standing> Build(int id)//contest id
        {
            Database.DB db = new Database.DB();
            List <Models.View.Standing> standings = new List <Models.View.Standing>();
            var contest = db.Contests.Find(id);
            var users   = (from s in db.Statuses
                           let pid = (from p in db.Problems
                                      where p.ContestID == contest.ID
                                      select p.ID).ToList()
                                     where pid.Contains(s.ProblemID) &&
                                     s.Time >= contest.Begin &&
                                     s.Time < contest.End
                                     select s.User).Distinct().ToList();

            foreach (var user in users)
            {
                standings.Add(new Models.View.Standing(user, contest));
            }
            Sort(contest.Format, ref standings);
            return(standings);
        }
Exemplo n.º 12
0
        public static void Update(int user_id, int contest_id, ref List <Models.View.Standing> standings)
        {
            Database.DB db           = new Database.DB();
            var         user         = db.Users.Find(user_id);
            var         contest      = db.Contests.Find(contest_id);
            var         index        = standings.FindIndex(x => x.UserID == user_id);
            var         new_standing = new Models.View.Standing(user, contest);

            if (index < 0)
            {
                standings.Add(new_standing);
            }
            else
            {
                standings[index] = new_standing;
            }
            Sort(contest.Format, ref standings);

            //推送排名变化
            SignalR.CodeCombHub.context.Clients.All.onStandingChanged(contest_id, new_standing);
        }
Exemplo n.º 13
0
 public Contest(Entity.Contest contest)
 {
     ID           = contest.ID;
     Format       = contest.Format.ToString();
     ProblemCount = contest.Problems.Count;
     Time         = contest.Begin.ToString("yyyy-MM-dd HH:mm");
     TimeLength   = Helpers.Time.ToVagueTimeLength(contest.Begin, contest.End);
     Title        = HttpUtility.HtmlEncode(contest.Title);
     Database.DB DbContext = new Database.DB();
     UserCount = (from s in DbContext.Statuses
                  let pid = (from p in DbContext.Problems
                             where p.ContestID == contest.ID
                             select p.ID).ToList()
                            where pid.Contains(s.ProblemID) &&
                            s.Time >= contest.Begin &&
                            s.Time < contest.End
                            select s.UserID).Distinct().Count();
     Managers = "";
     foreach (var m in contest.Managers)
     {
         Managers += String.Format("<a href='/User/{0}'>{1}</a> ", m.UserID, Helpers.ColorName.GetNicknameHtml(m.User.Nickname, m.User.Ratings.Sum(x => x.Credit) + 1500));
     }
     Rating = "";
     if (contest.Ready)
     {
         Rating = string.Format("<span class='label gray'>评级赛({0}~{1})</span> ", contest.RatingBegin, contest.RatingEnd);
     }
     if (string.IsNullOrEmpty(contest.Password))
     {
         Private = false;
     }
     else
     {
         Private = true;
     }
 }
Exemplo n.º 14
0
        public static bool IsUserInPrivateContest(Entity.User user, Entity.Contest contest)
        {
            if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End)
            {
                return(true);
            }
            if (string.IsNullOrEmpty(contest.Password))
            {
                return(true);
            }
            if (user == null)
            {
                return(false);
            }
            var joinlog = contest.JoinLogs.Where(x => x.UserID == user.ID).FirstOrDefault();

            if (joinlog == null)
            {
                if (user.Role >= Entity.UserRole.Master || (from cm in contest.Managers select cm.UserID).Contains(user.ID))
                {
                    Database.DB DbContext = new Database.DB();
                    DbContext.JoinLogs.Add(new Entity.JoinLog
                    {
                        ContestID = contest.ID,
                        UserID    = user.ID
                    });
                    DbContext.SaveChanges();
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
Exemplo n.º 15
0
        public static bool  _Rejudge(int id)
        {
            Database.DB DbContext = new Database.DB();
            var         status    = DbContext.Statuses.Find(id);
            var         problem   = status.Problem;
            var         contest   = problem.Contest;
            List <int>  testcase_ids;

            if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End || contest.Format == Entity.ContestFormat.ACM || contest.Format == Entity.ContestFormat.OPJOI || contest.Format == Entity.ContestFormat.OI)
            {
                testcase_ids = (from tc in problem.TestCases
                                where tc.Type != Entity.TestCaseType.Sample
                                orderby tc.Type ascending
                                select tc.ID).ToList();
            }
            else if (contest.Format == Entity.ContestFormat.Codeforces)
            {
                testcase_ids = (from tc in problem.TestCases
                                where tc.Type == Entity.TestCaseType.Unilateralism
                                orderby tc.Type ascending
                                select tc.ID).ToList();
                var statuses = problem.GetContestStatuses().Where(x => x.UserID == status.UserID).ToList();
                foreach (var s in statuses)
                {
                    foreach (var jt in s.JudgeTasks)
                    {
                        testcase_ids.Add(jt.TestCaseID);
                    }
                }
                testcase_ids = testcase_ids.Distinct().ToList();
            }
            else
            {
                if (DateTime.Now < contest.RestBegin)
                {
                    testcase_ids = (from tc in problem.TestCases
                                    where tc.Type == Entity.TestCaseType.Sample
                                    orderby tc.Type ascending
                                    select tc.ID).ToList();
                }
                else
                {
                    testcase_ids = (from tc in problem.TestCases
                                    where tc.Type != Entity.TestCaseType.Sample
                                    orderby tc.Type ascending
                                    select tc.ID).ToList();
                }
            }
            var existed_ids = (from jt in status.JudgeTasks
                               select jt.TestCaseID).ToList();

            testcase_ids = testcase_ids.Except(existed_ids).ToList();
            foreach (var tid in testcase_ids)
            {
                DbContext.JudgeTasks.Add(new Entity.JudgeTask
                {
                    StatusID    = status.ID,
                    TestCaseID  = tid,
                    Result      = Entity.JudgeResult.Pending,
                    MemoryUsage = 0,
                    TimeUsage   = 0,
                    Hint        = ""
                });
            }
            DbContext.SaveChanges();
            foreach (var jt in status.JudgeTasks)
            {
                try
                {
                    var group = SignalR.JudgeHub.GetNode();
                    if (group == null)
                    {
                        return(false);
                    }
                    SignalR.JudgeHub.context.Clients.Group(group).Judge(new Judge.Models.JudgeTask(jt));
                    SignalR.JudgeHub.ThreadBusy(group);
                    jt.Result = Entity.JudgeResult.Running;
                    DbContext.SaveChanges();
                }
                catch { }
            }
            SignalR.CodeCombHub.context.Clients.All.onStatusCreated(new Models.View.Status(status));//推送新状态
            return(true);
        }
Exemplo n.º 16
0
        public StandingCol(Entity.User user, Entity.Problem problem)
        {
            var contest = problem.Contest;
            var statuses = problem.GetContestStatuses().Where(x => x.UserID == user.ID).OrderBy(x=>x.Time).ToList();
            #region OI赛制逻辑
            if (contest.Format == Entity.ContestFormat.OI)
            {
                var status = statuses.LastOrDefault();
                if (status == null)
                {
                    StatusID = null;
                    Css = "";
                    Display = "";
                }
                else
                {
                    StatusID = status.ID;
                    var score = status.JudgeTasks.Where(x=>x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count;
                    Display = score.ToString();
                    if (score == 0)
                        Css = "rank-red";
                    else if (score != 100)
                        Css = "rank-orange";
                    else
                        Css = "rank-green";
                    Key1 = score;
                    Key2 = status.JudgeTasks.Sum(x => x.TimeUsage);
                    Key3 = status.JudgeTasks.Sum(x => x.MemoryUsage);
                }
            }
            #endregion
            #region OPJOI赛制逻辑
            else if (contest.Format == Entity.ContestFormat.OPJOI)
            {
                var status = statuses.LastOrDefault();
                if (status == null)
                {
                    StatusID = null;
                    Css = "";
                    Display = "";
                }
                else
                {
                    StatusID = status.ID;
                    var score = status.JudgeTasks.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count;
                    Display = score.ToString() + "(" + statuses.Count + ")";
                    if (score == 0)
                        Css = "rank-red";
                    else if (score != 100)
                        Css = "rank-orange";
                    else
                        Css = "rank-green";
                    Key1 = score;
                    Key2 = statuses.Count;
                    Key3 = status.JudgeTasks.Sum(x => x.TimeUsage);
                }
            }
            #endregion
            #region ACM赛制逻辑
            else if (contest.Format == Entity.ContestFormat.ACM)
            {
                if (statuses.Count == 0)
                {
                    StatusID = null;
                    Css = "";
                    Display = "";
                }
                else
                {
                    var status = statuses.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).FirstOrDefault();
                    var penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count();
                    if (status == null)
                    {
                        Display = "(-" + penalty_count + ")";
                        Css = "rank-red";
                        StatusID = null;
                        Key1 = 0;
                        Key2 = 0;
                        Key3 = penalty_count;
                    }
                    else
                    {
                        Css = "rank-green";
                        StatusID = status.ID;
                        penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt) && x.Time < status.Time).Count();
                        var penalty_time = (status.Time - status.Problem.Contest.Begin).Add(new TimeSpan(0, 20 * penalty_count, 0));
                        Display = penalty_time.ToString("c");
                        if (penalty_count > 0)
                            Display += "<br/>(-" + penalty_count + ")";
                        StatusID = status.ID;
                        Key1 = 1;
                        Key2 = (int)penalty_time.TotalSeconds;
                        Key3 = penalty_count;
                    }
                }
            }
            #endregion
            #region CF、TC赛制逻辑
            else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder)
            {
                Database.DB db = new Database.DB();
                var hack_success = (from h in db.Hacks
                                    where h.Status.ProblemID == problem.ID
                                    && h.HackerID == user.ID
                                    && h.ResultAsInt == (int)Entity.HackResult.Success
                                    select h).Count();
                var hack_failed = (from h in db.Hacks
                                   where h.Status.ProblemID == problem.ID
                                   && h.HackerID == user.ID
                                   && h.ResultAsInt == (int)Entity.HackResult.Failure
                                   select h).Count();
                Key2 = hack_success;
                Key3 = hack_failed;
                if (statuses.Count == 0)
                {
                    StatusID = null;
                    Css = "";
                    Display = "";
                }
                else
                {
                    var status = statuses.Last();
                    if (status.Result == Entity.JudgeResult.Accepted)
                    {
                        var max = problem.Credit;
                        var score = 0;
                        TimeSpan time;
                        if (contest.Format == Entity.ContestFormat.Codeforces)
                        {
                            score = Convert.ToInt32(max * (1 - 0.004 * (status.Time - problem.Contest.Begin).TotalMinutes));
                            time = status.Time - contest.Begin;
                        }
                        else
                        {
                            var glance = (from g in problem.Glances
                                          where g.UserID == user.ID
                                          select g).SingleOrDefault();
                            score = Convert.ToInt32(max * (1 * 0.004 * (status.Time - glance.Time).TotalMinutes));
                            time = status.Time - glance.Time;
                        }
                        score -= 50 * statuses.Where(x => !Entity.Status._FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count();
                        if (score < max * 0.3)
                            score = Convert.ToInt32(max * 0.3);
                        Key1 = score;
                        Css = "rank-green";
                        Display = Key1 + "<br/>(" + time.ToString("hh':'mm") + ")";
                        StatusID = status.ID;
                    }
                    else
                    {
                        Css = "rank-red";
                        Display = "(-" + statuses.Count + ")";
                    }
                }
            }
            #endregion
            #region CC赛制逻辑
            else//未实现
            {

            }
            #endregion
        }
Exemplo n.º 17
0
        public StandingCol(Entity.User user, Entity.Problem problem)
        {
            var contest  = problem.Contest;
            var statuses = problem.GetContestStatuses().Where(x => x.UserID == user.ID).OrderBy(x => x.Time).ToList();

            #region OI赛制逻辑
            if (contest.Format == Entity.ContestFormat.OI)
            {
                var status = statuses.LastOrDefault();
                if (status == null)
                {
                    StatusID = null;
                    Css      = "";
                    Display  = "";
                }
                else
                {
                    StatusID = status.ID;
                    var score = status.JudgeTasks.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count;
                    Display = score.ToString();
                    if (score == 0)
                    {
                        Css = "rank-red";
                    }
                    else if (score != 100)
                    {
                        Css = "rank-orange";
                    }
                    else
                    {
                        Css = "rank-green";
                    }
                    Key1 = score;
                    Key2 = status.JudgeTasks.Sum(x => x.TimeUsage);
                    Key3 = status.JudgeTasks.Sum(x => x.MemoryUsage);
                }
            }
            #endregion
            #region OPJOI赛制逻辑
            else if (contest.Format == Entity.ContestFormat.OPJOI)
            {
                var status = statuses.LastOrDefault();
                if (status == null)
                {
                    StatusID = null;
                    Css      = "";
                    Display  = "";
                }
                else
                {
                    StatusID = status.ID;
                    var score = status.JudgeTasks.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).Count() * 100 / status.JudgeTasks.Count;
                    Display = score.ToString() + "(" + statuses.Count + ")";
                    if (score == 0)
                    {
                        Css = "rank-red";
                    }
                    else if (score != 100)
                    {
                        Css = "rank-orange";
                    }
                    else
                    {
                        Css = "rank-green";
                    }
                    Key1 = score;
                    Key2 = statuses.Count;
                    Key3 = status.JudgeTasks.Sum(x => x.TimeUsage);
                }
            }
            #endregion
            #region ACM赛制逻辑
            else if (contest.Format == Entity.ContestFormat.ACM)
            {
                if (statuses.Count == 0)
                {
                    StatusID = null;
                    Css      = "";
                    Display  = "";
                }
                else
                {
                    var status        = statuses.Where(x => x.ResultAsInt == (int)Entity.JudgeResult.Accepted).FirstOrDefault();
                    var penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count();
                    if (status == null)
                    {
                        Display  = "(-" + penalty_count + ")";
                        Css      = "rank-red";
                        StatusID = null;
                        Key1     = 0;
                        Key2     = 0;
                        Key3     = penalty_count;
                    }
                    else
                    {
                        Css           = "rank-green";
                        StatusID      = status.ID;
                        penalty_count = statuses.Where(x => !Entity.Status.FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt) && x.Time < status.Time).Count();
                        var penalty_time = (status.Time - status.Problem.Contest.Begin).Add(new TimeSpan(0, 20 * penalty_count, 0));
                        Display = penalty_time.ToString("c");
                        if (penalty_count > 0)
                        {
                            Display += "<br/>(-" + penalty_count + ")";
                        }
                        StatusID = status.ID;
                        Key1     = 1;
                        Key2     = (int)penalty_time.TotalSeconds;
                        Key3     = penalty_count;
                    }
                }
            }
            #endregion
            #region CF、TC赛制逻辑
            else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder)
            {
                Database.DB db           = new Database.DB();
                var         hack_success = (from h in db.Hacks
                                            where h.Status.ProblemID == problem.ID &&
                                            h.HackerID == user.ID &&
                                            h.ResultAsInt == (int)Entity.HackResult.Success
                                            select h).Count();
                var hack_failed = (from h in db.Hacks
                                   where h.Status.ProblemID == problem.ID &&
                                   h.HackerID == user.ID &&
                                   h.ResultAsInt == (int)Entity.HackResult.Failure
                                   select h).Count();
                Key2 = hack_success;
                Key3 = hack_failed;
                if (statuses.Count == 0)
                {
                    StatusID = null;
                    Css      = "";
                    Display  = "";
                }
                else
                {
                    var status = statuses.Last();
                    if (status.Result == Entity.JudgeResult.Accepted)
                    {
                        var      max   = problem.Credit;
                        var      score = 0;
                        TimeSpan time;
                        if (contest.Format == Entity.ContestFormat.Codeforces)
                        {
                            score = Convert.ToInt32(max * (1 - 0.004 * (status.Time - problem.Contest.Begin).TotalMinutes));
                            time  = status.Time - contest.Begin;
                        }
                        else
                        {
                            var glance = (from g in problem.Glances
                                          where g.UserID == user.ID
                                          select g).SingleOrDefault();
                            score = Convert.ToInt32(max * (1 * 0.004 * (status.Time - glance.Time).TotalMinutes));
                            time  = status.Time - glance.Time;
                        }
                        score -= 50 * statuses.Where(x => !Entity.Status._FreeResults.Contains((Entity.JudgeResult)x.ResultAsInt)).Count();
                        if (score < max * 0.3)
                        {
                            score = Convert.ToInt32(max * 0.3);
                        }
                        Key1     = score;
                        Css      = "rank-green";
                        Display  = Key1 + "<br/>(" + time.ToString("hh':'mm") + ")";
                        StatusID = status.ID;
                    }
                    else
                    {
                        Css     = "rank-red";
                        Display = "(-" + statuses.Count + ")";
                    }
                }
            }
            #endregion
            #region CC赛制逻辑
            else//未实现
            {
            }
            #endregion
        }
Exemplo n.º 18
0
        public static void RatingCount(int id)//contest_id
        {
            RatingDelete(id);

            #region 初始化
            var DbContext = new Database.DB();
            var contest   = DbContext.Contests.Find(id);
            var statuses  = (from s in DbContext.Statuses
                             where s.Problem.ContestID == contest.ID
                             select s).ToList();
            var ranklist = Helpers.Standings.Build(id);
            var problems = contest.Problems.OrderBy(x => x.Credit).ToList();
            #endregion
            for (int i = 0; i < ranklist.Count; i++)
            {
                var user_credits = 0;
                #region 计算排名分 (-15 ~ 15)
                var pts = ranklist.Count / 2 - i;
                if (pts > 15)
                {
                    pts = 15;
                }
                if (pts < -15)
                {
                    pts = -15;
                }
                user_credits += pts - i;
                #endregion
                var num = 0;
                foreach (var detail in ranklist[i].Details)
                {
                    var problem_ratings = problems[num].Difficulty;
                    var user            = DbContext.Users.Find(ranklist[i].UserID);

                    var user_ratings = user.Ratings.Sum(x => x.Credit) + 1500;
                    var extend_pts   = (problem_ratings - user_ratings) / 300.0;
                    if (extend_pts > 1)
                    {
                        extend_pts = 1;
                    }
                    if (extend_pts < -1)
                    {
                        extend_pts = -1;
                    }

                    #region ACM赛制
                    if (contest.Format == Entity.ContestFormat.ACM)
                    {
                        var base_pts = 10;
                        base_pts -= detail.Key3;
                        if (base_pts < 0)
                        {
                            base_pts = 0;
                        }
                        if (detail.Key1 == 1)
                        {
                            user_credits += base_pts + (int)(Math.Floor((extend_pts + 1) * 25));
                        }
                        else
                        {
                            user_credits += (int)(Math.Floor((extend_pts - 1) * 25));
                        }
                    }
                    #endregion
                    #region OI赛制
                    else if (contest.Format == Entity.ContestFormat.OI)
                    {
                        if (detail.Key1 > 50)
                        {
                            user_credits += (int)((Math.Floor((extend_pts + 1) * 25) * (100 - detail.Key1) / 50.0));
                        }
                        else
                        {
                            user_credits += (int)(Math.Floor((extend_pts - 1) * 25) * (100 - detail.Key1) / 100.0);
                        }
                    }
                    #endregion
                    #region OPJOI赛制
                    else if (contest.Format == Entity.ContestFormat.OPJOI)
                    {
                        var base_pts = 10;
                        base_pts -= detail.Key2 + 1;
                        if (base_pts < 0)
                        {
                            base_pts = 0;
                        }
                        if (detail.Key1 > 50)
                        {
                            user_credits += (int)((Math.Floor((extend_pts + 1) * 25) * (100 - detail.Key1) / 50.0));
                        }
                        else
                        {
                            user_credits += (int)(Math.Floor((extend_pts - 1) * 25) * (100 - detail.Key1) / 100.0);
                        }
                    }
                    #endregion
                    #region CF、TC赛制
                    else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder)
                    {
                        var base_pts = (int)Math.Floor(detail.Key2 - (detail.Key3 / 2.0));
                        if (base_pts > 10)
                        {
                            base_pts = 10;
                        }
                        if (base_pts < -5)
                        {
                            base_pts = -5;
                        }
                        if (base_pts < 0)
                        {
                            base_pts = 0;
                        }
                        if (detail.Key1 > 0)
                        {
                            user_credits += base_pts + (int)((Math.Floor((extend_pts + 1) / 30)) * (problems[num].Credit - detail.Key1));
                        }
                        else
                        {
                            user_credits += base_pts + (int)((Math.Floor((extend_pts + 1) / 25)));
                        }
                    }
                    #endregion
                    num++;
                }
                DbContext.Ratings.Add(new Entity.Rating
                {
                    Credit    = user_credits,
                    ContestID = id,
                    Time      = contest.End,
                    UserID    = ranklist[i].UserID
                });
                DbContext.SaveChanges();
            }
        }