Skip to content

Commit bba7850

Browse files
as6325400meisterT
authored andcommitted
Change the total number of submissions to the number of submissions per minute.
Beta Optimize time complexity. fix count miniute edge bug
1 parent 93af8d8 commit bba7850

File tree

1 file changed

+42
-13
lines changed

1 file changed

+42
-13
lines changed

webapp/templates/jury/analysis/contest_overview.html.twig

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -356,26 +356,55 @@ nv.addGraph(function() {
356356
// x-axis is contest time
357357
// y axis is # of submissions
358358
359+
var max_submissions_per_minute = 0;
360+
359361
var submission_stats = [
360362
{% for result in ['correct', 'wrong-answer', 'timelimit', 'run-error', 'compiler-error', 'no-output'] %}
361363
{
362364
key: "{{result}}",
363365
color: "{{colors[result]}}",
364-
values: [
365-
{# TODO: make sure these are actually ordered by submittime #}
366-
{# TODO: also make sure these submissions are in the same contest #}
367-
[0,0],
368-
{% set count = 0 %}
369-
{% for submission in submissions | filter(submission => submission.result) %}
370-
{% if submission.result == result %}{% set count = count +1 %}{% endif %}
371-
[ {{ (submission.submittime - current_contest.starttime)/60.0 }},
372-
{{ count }}
373-
],
374-
{% endfor %}
375-
]
366+
values: []
376367
},
377368
{% endfor %}
378369
];
370+
371+
var submissions = [
372+
{% for submission in submissions %}
373+
{
374+
result: "{{ submission.result }}",
375+
submittime: {{ submission.submittime }},
376+
starttime: {{ current_contest.starttime }}
377+
}{{ loop.last ? '' : ',' }}
378+
{% endfor %}
379+
];
380+
381+
var contest_duration_minutes = Math.ceil(({{ current_contest.endtime }} - {{ current_contest.starttime }}) / 60);
382+
383+
submission_stats.forEach(stat => {
384+
stat.values = Array.from({ length: contest_duration_minutes }, (_, i) => [i, 0]);
385+
});
386+
387+
const statMap = submission_stats.reduce((map, stat) => {
388+
map[stat.key] = stat;
389+
return map;
390+
}, {});
391+
392+
submissions.forEach(submission => {
393+
let submission_minute = Math.floor((submission.submittime - submission.starttime) / 60);
394+
let stat = statMap[submission.result];
395+
if (stat && submission_minute >= 0 && submission_minute < contest_duration_minutes) {
396+
stat.values[submission_minute][1]++;
397+
}
398+
});
399+
400+
for (let minute = 0; minute < contest_duration_minutes; minute++) {
401+
let this_minute_submission_nums = 0;
402+
submission_stats.forEach(stat => {
403+
this_minute_submission_nums += stat.values[minute][1];
404+
});
405+
max_submissions_per_minute = Math.max(max_submissions_per_minute, this_minute_submission_nums);
406+
}
407+
379408
nv.addGraph(function() {
380409
var chart = nv.models.stackedAreaChart()
381410
// .margin({left: 100}) //Adjust chart margins to give the x-axis some breathing room.
@@ -388,7 +417,7 @@ nv.addGraph(function() {
388417
.showYAxis(true) //Show the y-axis
389418
.showXAxis(true) //Show the x-axis
390419
.forceX([0, {{ (current_contest.endtime - current_contest.starttime) / 60 }}])
391-
.forceY([0, {{ submissions|length *1.10 }}])
420+
.forceY([0, max_submissions_per_minute * 1.1 ])
392421
;
393422
chart.xAxis //Chart x-axis settings
394423
.axisLabel('Contest Time(minutes)')

0 commit comments

Comments
 (0)