luogu#P3892. [GDOI2014] OJ

[GDOI2014] OJ

题目描述

小 M 是一个勤奋的 ACMer,他利用课余时间刷了很多题目。但他是个很健忘的孩子,经常会忘记自己刷过一些什么题目,所以他想写一个 OJ 来管理自己做过的题目。

经过一个星期的努力,小 M 的 OJ 基本成型,只是还差一个 Contest 的模块没有实现。小 M 觉得这个模块很难实现,所以他希望找你来帮忙。

小 M 告诉你,一个 OJ 的基础元素包括:

  1. 题目,可以用 pid 唯一标识,pid 为正整数;
  2. 比赛,可以用 cid 唯一标识,cid 为正整数;
  3. 用户,可以用 uid 唯一标识,uid 为正整数;
  4. 提交状态,可以由 sid 唯一标识,sid 为正整数。

一个提交状态是由 sid、cid、pid、uid 和 result 组成的,分别表示本条状态的提交 ID,所属比赛 ID,题目 ID,用户 ID 以及评测结果。

简单起见,这里的 result 只有 AC、UNAC 和 WAIT 三种状态,分别表示通过、不通过和等待评测。

同时小 M 提出一个比赛模块需要实现以下请求:

  1. createContest cid t pid_1 pid_2 … pid_t

表示要创建一个比赛,cid 是一个正整数,是这场比赛的唯一标识。

tt 表示这场比赛有 tt((1t10001\le t\le1000))道题目,接下来 tt 个不同的整数,表示这场比赛的题目编号。

  1. submission sid cid pid uid result

该条状态的 sid 要么之前没出现过,要么以前出现过,但是被 rejudge 了。

result 为 AC 或者 UNAC。

  1. getRank cid uid

在一场比赛中,所有有提交的用户都应该算在排名内(包括被 rejudge 的提交),用户的排名按照通过的题目数从大到小排序,如果题目数相同,则按随机顺序排序。

该指令需要统计用户 uid 在 cid 这场比赛中的通过目数,最高排名以及最低排名。

值得注意的是,用户 uid 在 cid 这场比赛中同一道题目的多个通过记录只算一次。

输出格式为:uid solved highest lowest

分别代表用户 ID,通过题目数量,最高排名以及最低排名,其中 highestlowest\mathit{highest}\le\mathit{lowest}

  1. rejudge sid

重测以 sid 标识的提交记录,即将该记录的 result 改成 WAIT。

输入格式

第一行三个整数 pcnt\mathit{pcnt}ucnt\mathit{ucnt}mm($1\le\mathit{pcnt}\le5000,1\le\mathit{ucnt}\le5000,1\le m\le3\times10^5$),分别表示 OJ 有 pcnt 道题目,ucnt 个用户以及 m 条请求。

pid 的范围是 10001000+pcnt11000\sim1000+\mathit{pcnt}-1,uid 的范围是 1ucnt1\sim\mathit{ucnt},cid 的范围为 1501\sim501sidm1\le\mathit{sid}\le m

接下来有 mm 行,每行一个请求,请求为题述四种请求之一,请求需要按输入顺序执行。

你需要注意以下几点:

  1. 对于 createContest 请求,保证 cid 不会与之前的 createContest 的 cid 重复。
  2. 对于 submission 请求,在此请求前,保证比赛 cid 已经创建,题目 pid 是该场比赛的题目之一。
  3. 对于 getRank 指令,在此请求前,保证比赛 cid 已经创建,用户 uid 至少在该比赛中有一个提交记录。
  4. 对于 rejudge 指令,在此请求前,保证存在以 sid 标识的提交。

输出格式

对于每一个 getRank 请求,根据要求输出用户 ID,通过题目数量,最高排名以及最低排名,整数之间用一个空格隔开。

7 5 17
createContest 1 5 1001 1004 1002 1005 1006
submission 1 1 1001 1 AC
submission 2 1 1001 1 AC
submission 3 1 1001 2 UNAC
submission 4 1 1003 3 UNAC
getRank 1 1
getRank 1 2
getRank 1 3
rejudge 3
submission 3 1 1001 2 AC
getRank 1 2
submission 5 1 1006 2 AC
getRank 1 1
submission 6 1 1006 2 UNAC
getRank 1 2
rejudge 5
getRank 1 2

1 1 1 1
2 0 2 3
3 0 2 3
2 1 1 2
1 1 2 2
2 2 1 1
2 1 1 2

提示

对于 20%20\% 的数据,1pcnt,ucnt,m1001\le\mathit{pcnt},\mathit{ucnt},m\le100

对于 50%50\% 的数据,$1\le\mathit{pcnt},\mathit{ucnt}\le2000,1\le m\le50000$;

对于 100%100\% 的数据,$1\le\mathit{pcnt},\mathit{ucnt}\le5000,1\le m\le3\times10^5,1\le\mathit{cid}\le50$。