From ebf36fc7091317eb9bd1d27c45dcc9cc16238dc3 Mon Sep 17 00:00:00 2001 From: as6325400 Date: Thu, 26 Sep 2024 12:57:17 +0800 Subject: [PATCH] Change the total number of submissions to the number of submissions per minute. Beta Optimize time complexity. fix count miniute edge bug --- .../jury/analysis/contest_overview.html.twig | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/webapp/templates/jury/analysis/contest_overview.html.twig b/webapp/templates/jury/analysis/contest_overview.html.twig index 9a860e4ef1..97b214a2cd 100644 --- a/webapp/templates/jury/analysis/contest_overview.html.twig +++ b/webapp/templates/jury/analysis/contest_overview.html.twig @@ -356,26 +356,55 @@ nv.addGraph(function() { // x-axis is contest time // y axis is # of submissions +var max_submissions_per_minute = 0; + var submission_stats = [ {% for result in ['correct', 'wrong-answer', 'timelimit', 'run-error', 'compiler-error', 'no-output'] %} { key: "{{result}}", color: "{{colors[result]}}", - values: [ - {# TODO: make sure these are actually ordered by submittime #} - {# TODO: also make sure these submissions are in the same contest #} - [0,0], - {% set count = 0 %} - {% for submission in submissions | filter(submission => submission.result) %} - {% if submission.result == result %}{% set count = count +1 %}{% endif %} - [ {{ (submission.submittime - current_contest.starttime)/60.0 }}, - {{ count }} - ], - {% endfor %} - ] + values: [] }, {% endfor %} ]; + +var submissions = [ + {% for submission in submissions %} + { + result: "{{ submission.result }}", + submittime: {{ submission.submittime }}, + starttime: {{ current_contest.starttime }} + }{{ loop.last ? '' : ',' }} + {% endfor %} +]; + +var contest_duration_minutes = Math.ceil(({{ current_contest.endtime }} - {{ current_contest.starttime }}) / 60); + +submission_stats.forEach(stat => { + stat.values = Array.from({ length: contest_duration_minutes }, (_, i) => [i, 0]); +}); + +const statMap = submission_stats.reduce((map, stat) => { + map[stat.key] = stat; + return map; +}, {}); + +submissions.forEach(submission => { + let submission_minute = Math.floor((submission.submittime - submission.starttime) / 60); + let stat = statMap[submission.result]; + if (stat && submission_minute >= 0 && submission_minute < contest_duration_minutes) { + stat.values[submission_minute][1]++; + } +}); + +for (let minute = 0; minute < contest_duration_minutes; minute++) { + let this_minute_submission_nums = 0; + submission_stats.forEach(stat => { + this_minute_submission_nums += stat.values[minute][1]; + }); + max_submissions_per_minute = Math.max(max_submissions_per_minute, this_minute_submission_nums); +} + nv.addGraph(function() { var chart = nv.models.stackedAreaChart() // .margin({left: 100}) //Adjust chart margins to give the x-axis some breathing room. @@ -388,7 +417,7 @@ nv.addGraph(function() { .showYAxis(true) //Show the y-axis .showXAxis(true) //Show the x-axis .forceX([0, {{ (current_contest.endtime - current_contest.starttime) / 60 }}]) - .forceY([0, {{ submissions|length *1.10 }}]) + .forceY([0, max_submissions_per_minute * 1.1 ]) ; chart.xAxis //Chart x-axis settings .axisLabel('Contest Time(minutes)')