Files
hustoj/web/problemstatus.php
2024-10-10 12:56:56 +08:00

236 lines
6.2 KiB
PHP

<?php
$cache_time = 30;
$OJ_CACHE_SHARE = false;
require_once('./include/cache_start.php');
require_once('./include/db_info.inc.php');
require_once('./include/setlang.php');
$view_title = "$OJ_NAME";
require_once("./include/const.inc.php");
if (isset($_GET['id']))
$id = intval($_GET['id']);
if (isset($_GET['page']))
$page = strval(intval($_GET['page']));
else
$page = 0;
?>
<?php
if(isset($OJ_NOIP_KEYWORD)&&$OJ_NOIP_KEYWORD){
$now = date('Y-m-d H:i', time());
$sql="select count(contest_id) from contest where start_time<'$now' and end_time>'$now' and title like '%$OJ_NOIP_KEYWORD%'";
$row=pdo_query($sql);
$cols=$row[0];
if($cols[0]>0) {
$view_errors = "<h2> $MSG_NOIP_WARNING </h2>";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
}
$view_problem = array();
// total submit
$sql = "SELECT count(*) FROM solution WHERE problem_id=?";
$result = pdo_query($sql, $id);
$row = $result[0];
$view_problem[0][0] = $MSG_SUBMIT;
$view_problem[0][1] = $row[0];
$sql="update problem set submit=? where problem_id=?";
pdo_query($sql,$row[0],$id);
$total = intval($row[0]);
// total users
$sql = "SELECT count(DISTINCT user_id) FROM solution WHERE problem_id=?";
$result = pdo_query( $sql,$id);
$row = $result[0];
$view_problem[1][0]="$MSG_USER($MSG_SUBMIT)";
$view_problem[1][1]=$row[0];
// ac users
$sql = "SELECT count(DISTINCT user_id) FROM solution WHERE problem_id=? AND result='4'";
$result = pdo_query( $sql,$id);
$row = $result[0];
$acuser = intval($row[0]);
$view_problem[2][0] = "$MSG_USER($MSG_SOVLED)";
$view_problem[2][1] = $row[0];
//for ($i=4;$i<12;$i++){
$i = 3;
$sql = "SELECT result, count(1) FROM solution WHERE problem_id=? AND result>=4 GROUP BY result ORDER BY result";
$result = pdo_query( $sql, $id);
foreach ($result as $row) {
$view_problem[$i][0] = $jresult[$row[0]];
$view_problem[$i][1] = "<a href=status.php?problem_id=$id&jresult=".$row[0].">".$row[1]."</a>";
$view_problem_title[$i] = $jresult[$row[0]];
$view_problem_number[$i] = $row[1];
if($row[0]==4){
$sql="update problem set accepted=? where problem_id=?";
pdo_query($sql,$row[1],$id);
}
$i++;
}
//}
?>
<?php
$pagemin = 0;
$pagemax = intval(($acuser-1)/20);
if ($page<$pagemin)
$page = $pagemin;
if ($page>$pagemax)
$page = $pagemax;
$start = $page*20;
$sz = 20;
if ($start+$sz > $acuser)
$sz = $acuser-$start;
//check whether the problem in a contest
$sql = "SELECT 1 FROM `contest_problem` WHERE `problem_id`=$id AND `contest_id` IN (SELECT `contest_id` FROM `contest` WHERE `start_time`<? AND `end_time`>?)";
$rrs = pdo_query($sql, $now, $now);
$flag = count($rrs)==0;
// check whether the problem is ACed by user
$AC = false;
if (isset($OJ_AUTO_SHARE) && $OJ_AUTO_SHARE && isset($_SESSION[$OJ_NAME.'_'.'user_id'])) {
$sql = "SELECT 1 FROM solution WHERE result=4 AND problem_id=? AND user_id=?";
$rrs = pdo_query($sql, $id, $_SESSION[$OJ_NAME.'_'.'user_id']);
$AC = (intval(count($rrs))>0);
}
//check whether user has the right of view solutions of this problem
//echo "checking...";
if (isset($_SESSION[$OJ_NAME.'_'.'user_id'])) {
if(isset($_SESSION[$OJ_NAME.'_'.'s'.$id])) {
$AC = true;
//echo "Yes";
}
else {
$sql = "SELECT count(1) FROM privilege WHERE user_id=? AND rightstr=?";
$count = pdo_query($sql, $_SESSION[$OJ_NAME.'_'.'user_id'], "s".$id);
if ($count && $count[0][0]>0) {
$AC = true;
}
else {
//echo "not right";
}
}
}
$sql = "SELECT * FROM (
SELECT COUNT(*) att, user_id, min(10000000000000000000 + time*100000000000 + memory*100000 + code_length) score
FROM solution
WHERE problem_id =? AND result =4
GROUP BY user_id
ORDER BY score
)c
inner JOIN (
SELECT solution_id, user_id, language, 10000000000000000000 + time*100000000000 + memory*100000 + code_length score, in_date
FROM solution
WHERE problem_id =? AND result =4
ORDER BY score
)b ON b.user_id=c.user_id AND b.score=c.score ORDER BY c.score, solution_id ASC LIMIT $start, $sz;";
//echo $sql;
//$result = pdo_query("SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");
$result = pdo_query($sql, $id, $id);
$view_solution = array();
$j = 0;
$last_user_id = '';
$i = $start+1;
foreach ($result as $row) {
if ($row['user_id'] == $last_user_id)
continue;
$sscore = strval($row['score']);
$s_time = intval(substr($sscore,1,8));
$s_memory = intval(substr($sscore,9,6));
$s_cl = intval(substr($sscore,15,5));
$view_solution[$j][0] = $i;
$view_solution[$j][1] = $row['solution_id'];
if (intval($row['att']) > 1)
$view_solution[$j][1] .= "(".$row['att'].")";
$view_solution[$j][2] = "<a href='userinfo.php?user=".$row['user_id']."'>".$row['user_id']."</a>";
if ($flag)
$view_solution[$j][3] = "$s_memory KiB";
else
$view_solution[$j][3] = "------";
if ($flag)
$view_solution[$j][4] = "$s_time ms";
else
$view_solution[$j][4] = "------";
if (!(isset($_SESSION[$OJ_NAME.'_'.'user_id']) && !strcasecmp($row['user_id'], $_SESSION[$OJ_NAME.'_'.'user_id']) ||
isset($_SESSION[$OJ_NAME.'_'.'source_browser'])|| (isset($OJ_AUTO_SHARE)&&$OJ_AUTO_SHARE&&$AC))) {
$view_solution[$j][5] = $language_name[$row['language']];
}
else {
$view_solution[$j][5] = "<a target=_blank href=showsource.php?id=".$row['solution_id'].">".$language_name[$row['language']]."</a>";
}
if ($flag)
$view_solution[$j][6] = "$s_cl bytes";
else
$view_solution[$j][6] = "------";
$view_solution[$j][7] = $row['in_date'];
$j++;
$last_user_id = $row['user_id'];
$i++;
}
$view_recommand = Array();
if (isset($_GET['id'])) {
$id = intval($_GET['id']);
if (isset($_SESSION[$OJ_NAME.'_'.'user_id']))
$user_id = ($_SESSION[$OJ_NAME.'_'.'user_id']);
$sql = "SELECT source FROM problem WHERE problem_id=?";
$result = pdo_query($sql, $id);
$source = $result[0][0];
$sql = "SELECT problem_id FROM problem WHERE source LIKE ? AND problem_id!=? LIMIT 10";
$result = pdo_query($sql, "%$source%", $id);
$i = 0;
foreach ($result as $row) {
$view_recommand[$i][0] = $row['problem_id'];
$i++;
}
}
/////////////////////////Template
require("template/".$OJ_TEMPLATE."/problemstatus.php");
/////////////////////////Common foot
if(file_exists('./include/cache_end.php'))
require_once('./include/cache_end.php');
?>