from django.utils.translation import gettext_lazy from judge.contest_format.ioi import IOIContestFormat from judge.contest_format.registry import register_contest_format from django.db.models import Min, OuterRef, Subquery # This contest format only counts last submission for each problem. @register_contest_format("ultimate") class UltimateContestFormat(IOIContestFormat): name = gettext_lazy("Ultimate") def update_participation(self, participation): cumtime = 0 score = 0 format_data = {} queryset = participation.submissions if self.contest.freeze_after: queryset = queryset.filter( submission__date__lt=participation.start + self.contest.freeze_after ) queryset = ( queryset.values("problem_id") .filter( id=Subquery( queryset.filter(problem_id=OuterRef("problem_id")) .order_by("-id") .values("id")[:1] ) ) .values_list("problem_id", "submission__date", "points") ) for problem_id, time, points in queryset: if self.config["cumtime"]: dt = (time - participation.start).total_seconds() if points: cumtime += dt else: dt = 0 format_data[str(problem_id)] = { "time": dt, "points": points, } score += points self.handle_frozen_state(participation, format_data) participation.cumtime = max(cumtime, 0) participation.score = round(score, self.contest.points_precision) participation.tiebreaker = 0 participation.format_data = format_data participation.save()