BOJ 대회 스코어보드

아직 제출이 없습니다시간 제한1초메모리 제한512 MB

문제

BOJ의 대회는 두 종류로 나눌 수 있다.

  1. 일반 대회: 맞은 문제의 개수가 참가자가 획득한 점수
  2. 점수 대회: 각 문제에서 획득한 점수의 합이 참가자가 획득한 점수

BOJ의 문제는 두 종류로 나눌 수 있다.

  1. 일반 문제: 제출 결과는 "성공", "실패" 2가지가 있다.
  2. 점수 문제: 제출 결과는 "성공", "부분 성공", "실패" 3가지가 있다. "성공", "부분 성공"의 경우 제출의 점수가 존재한다.

대회는 다음과 같은 값을 가진다.

  • 페널티 (penalty): 대회의 페널티 (0 ≤ penalty ≤ 100)
  • 대회의 시작 시간 (start): 대회가 시작한 시간이다. yyyy-MM-dd HH:mm:ss 형식이다.
  • 마지막 페널티 (last): 마지막 페널티를 사용하면 1, 아니면 0
  • 컴파일 에러 제외 (ce): 컴파일 에러를 제출에서 제외하면 1, 아니면 0
    • 이 값이 1인 경우 결과가 컴파일 에러를 받은 제출은 없는 제출이다.
  • 점수 (cscore): 점수 대회인 경우 1, 아니면 0
    • 이 값이 0이면서 대회 문제의 배점 값이 0이 아닐 수도 있다. 이 경우 문제의 배점은 모두 무시한다.
  • 페널티 포맷 (format): 페널티를 분으로 보여주는 경우 0, 시:분으로 보여주는 경우 1
    • 이 값이 1면서 분이 1자리인 경우 앞에 0을 채워 2자리로 만든다.

대회에 포함된 문제는 3가지 값을 가진다.

  1. 번호 (id): BOJ에서 문제를 구분하기 위해 사용하는 고유 번호 (1,000 ≤ id ≤ 30,000)
  2. 순서 (order): 대회 문제의 순서로 문제를 정렬하는데 사용 (1 ≤ order ≤ 대회에 포함된 문제의 개수)
  3. 배점 (pscore): 점수 대회에서만 사용하는 값으로, 문제의 배점이다. (0 ≤ pscore ≤ 2,147,483,647)

일반 대회의 경우

  • 일반 문제: "성공"만 맞은 문제
  • 점수 문제: "성공"만 맞은 문제

이고

점수 대회의 경우

  • 일반 문제: "성공"의 경우 문제의 배점을 모두 획득, "실패"의 경우 0점
  • 점수 문제: "성공", "부분 성공"의 경우 제출의 점수를 획득, "실패"의 경우 0점

이다. 점수 대회의 경우 0점이 아니면 맞은 문제이다.

점수 문제에서 "성공"과 "부분 성공"의 기준과 대회에서 사용하는 문제의 "성공"과 "부분 성공"의 기준은 다르다. 대회에서는 문제의 배점과 획득한 점수가 같아야 "성공"이다. 따라서, 제출 결과가 "성공"이지만, 대회 결과에서는 "부분 성공"이 나올 수 있다.

제출은 다음과 같은 값을 가진다.

  • 제출 번호 (sid): 제출 순으로 BOJ에서 정하는 제출 번호. (1 ≤ sid ≤ 109)
  • 문제 번호 (pid): 제출한 문제의 번호. 여기서 사용하는 문제의 번호는 대회 문제의 값 중에서 id이다.
  • 유저 아이디 (uid): 제출한 유저의 아이디이다. [A-Za-z0-9_]{1,20}을 만족한다.
  • 채점 결과 (result): 4인 경우만 "성공" 또는 "부분 성공"이다. 컴파일 에러의 경우는 11이다. (4 ≤ result ≤ 13)
    • result가 13인 경우 제출이 없는 것으로 무시해야 한다.
  • 부분 성공 여부 (presult): result가 4인 경우만 의미가 있으며, 그 외의 경우에는 무시한다. 0이면 "성공", 1이면 "부분 성공"이다. (0 ≤ presult ≤ 1)
  • 점수 (score): result가 4일때만 의미가 있으며, 그 외의 경우에는 무시한다. (0 ≤ score ≤ 2,147,483,647)
  • 제출 시간 (date): 제출된 시간이다. yyyy-MM-dd HH:mm:ss 형식이다.

유저 u와 문제 p 사이에서 좋은 제출을 정의할 수 있다. 유저 u가 문제 p를 맞은 적이 없으면 좋은 제출은 없고, 대회별로 다음과 같이 정의한다.

  • 일반 대회: 맞은 적이 있으면, 제출 번호가 가장 작은 제출이 좋은 제출이다.
  • 점수 대회: 최고점을 획득한 맞은 제출이 좋은 제출이다. 그러한 제출이 여러가지인 경우 제출 번호가 가장 작은 제출이 좋은 제출이다.

유저 u가 문제 p에서 획득한 페널티는 "페널티 1"과 "페널티 2"로 두 종류가 있으며 다음과 같이 정의한다.페널티"는 "페널티 1"과 "페널티 2"를 더한 값이다. 단, "마지막 페널티"를 사용하는 경우 "페널티"는 "페널티 2"와 같은 값이다.

  • 페널티 1

    • (좋은 제출 전까지 유저 u가 문제 p에 제출한 횟수) × (대회의 페널티)
    • 좋은 제출이 없으면 0
  • 페널티 2

    • 대회 시작부터 좋은 제출이 제출되기까지 쇼요된 시간, 단위는 분
    • 좋은 제출이 없으면 0

유저 u와 문제 p 사이에서 시도한 횟수를 정의할 수 있다. 시도한 횟수는 문제 p의 좋은 제출보다 제출 번호가 작거나 같은 제출의 수이다. 좋은 제출이 없으면 문제 p에 제출한 제출의 수와 같다.

유저 u의 페널티는 대회의 "마지막 페널티" 값에 따라서 다르게 계산한다.

  • 마지막 페널티를 사용하지 않는 경우 유저 u가 각 문제에서 획득한 모든 페널티를 합한다.
  • 마지막 페널티를 사용한 경우: (각 문제의 "페널티 2" 중에서 최댓값) + (모든 문제의 "페널티 1"의 합)

스코어보드에서 유저의 순서는 다음과 같은 조건으로 정렬되어 있다.

  1. 획득한 점수가 높은 순
  2. 페널티가 적은 순
  3. 마지막으로 맞은 제출 번호가 작은 순
  4. 마지막으로 제출한 제출 번호가 작은 순
  5. 유저의 아이디가 사전 순으로 앞서는 순

마지막으로 맞은 제출 번호 또는 제출한 제출 번호가 없는 경우에는 제출 번호를 0으로 가정한다.

유저 u의 등수는 위의 조건 중 1번과 2번만 사용했을 때, 자신보다 순서가 앞서는 사람의 수 + 1이다.

입력

첫째 줄에 대회의 정보 penalty, start, last, ce, cscore, format이 주어진다.

둘째 줄에 대회에 포함된 문제의 수 N (1 ≤ N ≤ 26)이 주어진다.

셋째 줄부터 N개의 줄에 대회 문제의 값 id, order, pscore가 한 줄에 하나씩 주어진다.

다음 줄에는 대회에 참가한 유저의 수 M (1 ≤ M ≤ 1,000)이 주어지고, 그 다음 줄에 대회에 참가한 유저의 아이디가 주어진다.

그 다음 줄에는 이 대회에 제출된 제출의 수 S (1 ≤ S ≤ 1,000,000)가 주어진다.

다음 S개의 줄에 제출의 정보 sid, pid, uid, result, presult, score, date가 한 줄에 하나씩 주어진다. 제출은 제출 번호가 증가하는 순이다.

대회에 참가한 유저의 아이디에 포함되지 않은 유저의 제출도 주어질 수 있다. 이 경우에는 그 유저의 모든 제출을 무시한다.

출력

총 M개의 줄을 출력해야 한다. 우선 순위가 높은 사람부터 낮은 사람까지 다음 정보를 한 줄에 하나씩 ,로 구분해 출력해야 한다.

  • 유저의 등수

  • 유저의 아이디

  • 유저 u의 문제 p에 대한 결과, 문제는 대회 문제의 값 order의 오름차순으로 출력해야 한다.

    • 일반 대회

      • 맞은 경우: "a/시도한 횟수/획득한 페널티"
      • 시도를 한 적은 있으나 맞지 못한 경우: "w/시도한 횟수/--"
      • 시도를 한 적이 없는 경우: "0/--"
    • 점수 대회

      • 맞은 경우: "성공 여부/좋은 제출의 점수/시도한 횟수/획득한 페널티"
        • 성공 여부는 좋은 제출의 점수가 문제의 배점이 같으면 a, 아니면 p이다.
      • 시도를 한 적은 있으나 좋은 제출이 없는 경우: "w/시도한 횟수/--"
      • 시도를 한 적이 없는 경우: "0/--"
  • 유저의 최종 정보 "획득한 점수/유저의 페널티"

제한

입력으로 주어지는 모든 수는 정수이다.

힌트

스코어보드를 HTML 표로 생성하는 BOJ의 소스 코드를 이용해서 이 문제의 데이터를 만들었다.