You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
7.5 KiB
158 lines
7.5 KiB
<% this.title = '排名 - ' + contest.title %> |
|
<% include header %> |
|
<style> |
|
.submit_time { |
|
font-size: 0.8em; |
|
margin-top: 5px; |
|
color: #000; |
|
} |
|
</style> |
|
<div class="padding"> |
|
<table class="ui very basic center aligned table"> |
|
<thead> |
|
<tr> |
|
<th>#</th> |
|
<th>用户名</th> |
|
<% if (contest.type === 'acm') { %> |
|
<th>通过数量</th> |
|
<th>罚时</th> |
|
<% } %> |
|
<% for (let i = 0; i < problems.length; i++) { %> |
|
<th> |
|
<a href="<%= syzoj.utils.makeUrl(['contest', contest.id, 'problem', i + 1]) %>"> |
|
<%= syzoj.utils.removeTitleTag(problems[i].title) %> |
|
</a> |
|
</th> |
|
<% } %> |
|
<% if (contest.type === 'noi' || contest.type === 'ioi') { %> |
|
<th>总分</th> |
|
<% } %> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
<% |
|
for (let problem of problems) { |
|
let i = 0, min, minPos = -1; |
|
for (let item of ranklist) { |
|
i++; |
|
let condition; |
|
if (contest.type === 'acm') condition = item.player.score_details[problem.id] && item.player.score_details[problem.id].accepted && (minPos === -1 || item.player.score_details[problem.id].acceptedTime < min.player.score_details[problem.id].acceptedTime); |
|
else condition = item.player.score_details[problem.id] && item.player.score_details[problem.id].score === 100 && (minPos === -1 || item.player.score_details[problem.id].judge_state.submit_time < min.player.score_details[problem.id].judge_state.submit_time); |
|
if (condition) { |
|
min = item; |
|
minPos = i; |
|
} |
|
} |
|
problem.min = minPos; |
|
} |
|
|
|
let i = 0, rank = 0, lastItem; |
|
for (let item of ranklist) { |
|
i++; |
|
let latest = contest.start_time, timeSum = 0, unacceptedCount = 0; |
|
%> |
|
<tr> |
|
<% |
|
if (contest.type === 'noi' || contest.type === 'ioi') { |
|
if (i === 1 || item.player.score !== lastItem.player.score) rank = i; |
|
} else if (contest.type === 'acm') { |
|
for (let problem of problems) { |
|
if (item.player.score_details[problem.id] && item.player.score_details[problem.id].accepted) { |
|
timeSum += (item.player.score_details[problem.id].acceptedTime - contest.start_time) + (item.player.score_details[problem.id].unacceptedCount * 20 * 60); |
|
unacceptedCount += item.player.score_details[problem.id].unacceptedCount; |
|
} |
|
} |
|
item.player.timeSum = timeSum; |
|
|
|
if (i === 1 || item.player.score !== lastItem.player.score || item.player.timeSum !== lastItem.player.timeSum) rank = i; |
|
} |
|
%> |
|
<td> |
|
<% if (rank == 1) { %> |
|
<div class="ui yellow ribbon label"> |
|
<% } else if (rank == 2) { %> |
|
<div class="ui ribbon label"> |
|
<% } else if (rank == 3) { %> |
|
<div class="ui brown ribbon label" style="background-color: #C47222 !important;"> |
|
<% } else { %> |
|
<div> |
|
<% } %> |
|
<%= rank %> |
|
</div> |
|
</td> |
|
<td><a href="<%= syzoj.utils.makeUrl(['user', item.user.id]) %>"><%= item.user.username %></a><% if (item.user.nameplate) { %><%- item.user.nameplate %><% } %></td> |
|
<% if (contest.type === 'acm') { %> |
|
<td> |
|
<span class="score score_<%= parseInt((item.player.score / ranklist[0].player.score * 10) || 0) %>"> |
|
<%= item.player.score %> |
|
</span> |
|
</td> |
|
<td> |
|
<%= syzoj.utils.formatTime(timeSum) %> |
|
</td> |
|
<% } %> |
|
<% for (let problem of problems) { %> |
|
<% if (problem.min === i) { %> |
|
<td style="background: rgb(244, 255, 245); "> |
|
<% } else { %> |
|
<td> |
|
<% } %> |
|
<% if (!item.player.score_details[problem.id]) { %> |
|
</td> |
|
<% } else if (contest.type === 'acm') { %> |
|
<a href="<%= syzoj.utils.makeUrl(['submission', item.player.score_details[problem.id].judge_id]) %>"> |
|
<% if (item.player.score_details[problem.id].accepted) { %> |
|
<span class="score score_10"> |
|
<% if (item.player.score_details[problem.id].unacceptedCount) { %> |
|
+<%= item.player.score_details[problem.id].unacceptedCount %> |
|
<% } else { %> |
|
+ |
|
<% } %> |
|
</span> |
|
|
|
<div class="submit_time"> |
|
<%= syzoj.utils.formatTime(item.player.score_details[problem.id].acceptedTime - contest.start_time) %> |
|
</div> |
|
<% } else if (item.player.score_details[problem.id].unacceptedCount) { %> |
|
<span class="score score_0"> |
|
-<%= item.player.score_details[problem.id].unacceptedCount %> |
|
</span> |
|
<% } %> |
|
</a> |
|
</td> |
|
<% } else if (contest.type === 'noi' || contest.type === 'ioi') { %> |
|
<a href="<%= syzoj.utils.makeUrl(['submission', item.player.score_details[problem.id].judge_id]) %>"> |
|
<% if (item.player.score_details[problem.id].weighted_score != null) { %> |
|
<span class="score score_<%= parseInt((item.player.score_details[problem.id].score / 10) || 0) %>"> |
|
<%= Math.round(item.player.score_details[problem.id].weighted_score) %> |
|
</span> |
|
<% } else { %> |
|
<span class="status compile_error"> |
|
0 |
|
</span> |
|
<% } %> |
|
</a> |
|
<div class="submit_time"> |
|
<%= syzoj.utils.formatTime(item.player.score_details[problem.id].judge_state.submit_time - contest.start_time) %> |
|
<% latest = Math.max(latest, item.player.score_details[problem.id].judge_state.submit_time) %> |
|
</div> |
|
</td> |
|
<% } %> |
|
<% } %> |
|
<% if (contest.type === 'noi' || contest.type === 'ioi') { %> |
|
<td> |
|
<span class="score score_<%= parseInt((item.player.score / ranklist[0].player.score * 10) || 0) %>"> |
|
<%= item.player.score %> |
|
</span> |
|
<div class="submit_time"> |
|
<%= syzoj.utils.formatTime(latest - contest.start_time) %> |
|
</div> |
|
</td> |
|
<% } %> |
|
</tr> |
|
<% lastItem = item; %> |
|
<% } %> |
|
</tbody> |
|
</table> |
|
</div> |
|
<% include footer %>
|
|
|