Ejemplo n.º 1
0
        public async Task Reject(DbContext db, JudgingFinishedRequest args)
        {
            bool   showPublic = !args.Frozen;
            double time       = (args.SubmitTime - args.ContestTime).TotalSeconds;
            int    time2      = (int)(time / 60);
            int    score      = args.TotalScore;
            bool   fullScore  = args.Verdict == Verdict.Accepted;
            bool   isCorrect  = fullScore || args.TotalScore > 0;

            // 反向操作
            var oldScoreQuery = db.Score(args.ContestId, args.ProblemId, args.TeamId)
                                .Select(sc => new { sc.ContestId, sc.TeamId, Delta = score - (sc.ScoreRestricted ?? 0) });

            await db.Set <RankCache>().MergeAsync(
                sourceTable: oldScoreQuery,
                targetKey: args => new { args.ContestId, args.TeamId },
                sourceKey: args => new { args.ContestId, args.TeamId },
                delete: false,

                updateExpression: (rc, dt) => new RankCache
            {
                PointsRestricted    = rc.PointsRestricted + dt.Delta,
                TotalTimeRestricted = time2,

                PointsPublic    = showPublic ? rc.PointsPublic + dt.Delta : rc.PointsPublic,
                TotalTimePublic = showPublic ? time2 : rc.TotalTimePublic,
            },

                insertExpression: dt => new RankCache
            {
                ContestId = dt.ContestId,
                TeamId    = dt.TeamId,

                PointsRestricted    = dt.Delta,
                TotalTimeRestricted = time2,

                PointsPublic    = showPublic ? dt.Delta : 0,
                TotalTimePublic = showPublic ? time2    : 0,
            });

            await db.Score(args.ContestId, args.ProblemId, args.TeamId)
            .BatchUpdateAsync(sc => new ScoreCache
            {
                ScoreRestricted      = score,
                SolveTimeRestricted  = time,
                IsCorrectRestricted  = isCorrect,
                PendingRestricted    = sc.PendingRestricted - 1,
                SubmissionRestricted = sc.SubmissionRestricted + 1,

                ScorePublic      = showPublic ? score                   : sc.ScorePublic,
                SolveTimePublic  = showPublic ? time                    : sc.SolveTimePublic,
                IsCorrectPublic  = showPublic ? isCorrect               : sc.IsCorrectPublic,
                PendingPublic    = showPublic ? sc.PendingPublic - 1    : sc.PendingPublic,
                SubmissionPublic = showPublic ? sc.SubmissionPublic + 1 : sc.SubmissionPublic,

                FirstToSolve = fullScore,
            });
        }
Ejemplo n.º 2
0
 public Task CompileError(DbContext db, JudgingFinishedRequest args)
 {
     return(db.Score(args.ContestId, args.ProblemId, args.TeamId)
            .Where(s => s.PendingRestricted > 0)
            .BatchUpdateAsync(s => new ScoreCache
     {
         PendingRestricted = s.PendingRestricted - 1,
     }));
 }
Ejemplo n.º 3
0
        public Task CompileError(DbContext db, JudgingFinishedRequest args)
        {
            bool showPublic = !args.Frozen;

            return(db.Score(args.ContestId, args.ProblemId, args.TeamId)
                   .BatchUpdateAsync(s => new ScoreCache
            {
                PendingPublic = showPublic ? s.PendingPublic - 1 : s.PendingPublic,
                PendingRestricted = s.PendingRestricted - 1,
            }));
        }
Ejemplo n.º 4
0
        public Task Reject(DbContext db, JudgingFinishedRequest args)
        {
            // 在这种情况下,是系统终测时测了某个Accepted提交
            // 我们规定 System Test 是由某个 Rejudging 关联的,但是处于 Active 状态的 Rejudging。
            bool fst = args.Judging.Active && args.Judging.RejudgeId.HasValue;

            return(db.Score(args.ContestId, args.ProblemId, args.TeamId)
                   .BatchUpdateAsync(t => new ScoreCache
            {
                SubmissionRestricted = t.SubmissionRestricted + 1,
                SubmissionPublic = t.IsCorrectPublic ? t.SubmissionPublic : t.SubmissionPublic + 1,
                FirstToSolve = fst,
            }));
        }
Ejemplo n.º 5
0
        public Task Reject(DbContext db, JudgingFinishedRequest args)
        {
            bool showPublic  = !args.Frozen;
            int  publicDelta = args.Frozen ? 0 : 1;

            return(db.Score(args.ContestId, args.ProblemId, args.TeamId)
                   .Where(s => s.PendingRestricted > 0)
                   .BatchUpdateAsync(s => new ScoreCache
            {
                PendingPublic = showPublic ? s.PendingPublic - 1    : s.PendingPublic,
                SubmissionPublic = showPublic ? s.SubmissionPublic + 1 : s.SubmissionPublic,
                PendingRestricted = s.PendingRestricted - 1,
                SubmissionRestricted = s.SubmissionRestricted + 1,
            }));
        }
Ejemplo n.º 6
0
        public async Task Accept(DbContext db, JudgingFinishedRequest args)
        {
            double time = (args.SubmitTime - args.ContestTime).TotalSeconds;
            int    timee = (int)(time / 60);
            int    minScore = args.CfScore * 3 / 10, rateScore = args.CfScore - timee * (args.CfScore / 250);

            var oldScoreQuery = db.Score(args.ContestId, args.ProblemId, args.TeamId)
                                .Select(old => new
            {
                old.ContestId,
                old.TeamId,
                OldScore = old.ScorePublic ?? 0,
                NewScore = minScore > rateScore - old.SubmissionRestricted * 50 ? minScore : rateScore - old.SubmissionRestricted * 50,
            });

            await db.Set <RankCache>().MergeAsync(
                sourceTable: oldScoreQuery,
                targetKey: rc => new { rc.ContestId, rc.TeamId },
                sourceKey: rc => new { rc.ContestId, rc.TeamId },
                delete: false,

                updateExpression: (r, s) => new RankCache
            {
                PointsPublic    = r.PointsPublic - s.OldScore + s.NewScore,
                TotalTimePublic = timee,
            },

                insertExpression: s => new RankCache
            {
                ContestId       = s.ContestId,
                TeamId          = s.TeamId,
                PointsPublic    = s.NewScore,
                TotalTimePublic = timee,
            });

            await db.Score(args.ContestId, args.ProblemId, args.TeamId)
            .BatchUpdateAsync(old => new ScoreCache
            {
                SubmissionRestricted = old.SubmissionRestricted + 1,
                PendingRestricted    = old.PendingRestricted - 1,
                ScorePublic          = minScore > rateScore - old.SubmissionRestricted * 50 ? minScore : rateScore - old.SubmissionRestricted * 50,
                IsCorrectPublic      = true,
                SolveTimePublic      = time,
                SubmissionPublic     = old.SubmissionRestricted + 1,
            });
        }
Ejemplo n.º 7
0
 public Task Accept(DbContext db, JudgingFinishedRequest args)
 {
     return(Reject(db, args));
 }
Ejemplo n.º 8
0
        public async Task Accept(DbContext db, JudgingFinishedRequest args)
        {
            // first blood:此处竞态条件可以暂时无视?
            var fbQuery =
                from sc in db.Set <ScoreCache>()
                where sc.ContestId == args.ContestId && sc.ProblemId == args.ProblemId && sc.FirstToSolve
                join t in db.Set <Team>() on new { sc.ContestId, sc.TeamId } equals new { t.ContestId, t.TeamId }
            join c in db.Set <TeamCategory>() on t.CategoryId equals c.CategoryId
            where (from t in db.Set <Team>()
                   where t.ContestId == args.ContestId && t.TeamId == args.TeamId
                   join c in db.Set <TeamCategory>() on t.CategoryId equals c.CategoryId
                   select c.SortOrder).Contains(c.SortOrder)
            select t.TeamId;
            bool firstBlood = !await fbQuery.AnyAsync();

            double time       = (args.SubmitTime - args.ContestTime).TotalSeconds;
            int    score      = time < 0 ? -(((int)-time) / 60) : ((int)time) / 60;
            bool   showPublic = !args.Frozen;

            int affectedRows = await db.Score(args.ContestId, args.ProblemId, args.TeamId)
                               .Where(s => s.PendingRestricted > 0)
                               .BatchUpdateAsync(s => new ScoreCache
            {
                PendingPublic    = showPublic ? s.PendingPublic - 1    : s.PendingPublic,
                SubmissionPublic = showPublic ? s.SubmissionPublic + 1 : s.SubmissionPublic,
                ScorePublic      = showPublic ? score                  : (int?)null,
                SolveTimePublic  = showPublic ? time                   : 0,
                IsCorrectPublic  = showPublic,

                PendingRestricted    = s.PendingRestricted - 1,
                SubmissionRestricted = s.SubmissionRestricted + 1,
                ScoreRestricted      = score,
                SolveTimeRestricted  = time,
                IsCorrectRestricted  = true,

                FirstToSolve = firstBlood,
            });

            if (affectedRows == 0)
            {
                return;
            }

            // 将此处罚时计算交给数据库,减少数据拉取量
            var updateRankQuery = db.Score(args.ContestId, args.ProblemId, args.TeamId)
                                  .Select(sc => new
            {
                sc.ContestId, sc.TeamId,
                Penalty = score + 20 * (sc.SubmissionRestricted - 1)
            });

            await db.Set <RankCache>().MergeAsync(
                sourceTable: updateRankQuery,
                targetKey: rc => new { rc.ContestId, rc.TeamId },
                sourceKey: rc => new { rc.ContestId, rc.TeamId },
                delete: false,

                updateExpression: (r, s) => new RankCache
            {
                PointsRestricted    = r.PointsRestricted + 1,
                TotalTimeRestricted = r.TotalTimeRestricted + s.Penalty,
                PointsPublic        = showPublic ? r.PointsPublic + 1            : r.PointsPublic,
                TotalTimePublic     = showPublic ? r.TotalTimePublic + s.Penalty : r.TotalTimePublic,
            },

                insertExpression: s => new RankCache
            {
                ContestId           = s.ContestId,
                TeamId              = s.TeamId,
                PointsRestricted    = 1,
                TotalTimeRestricted = s.Penalty,
                PointsPublic        = showPublic ? 1         : 0,
                TotalTimePublic     = showPublic ? s.Penalty : 0,
            });
        }