语言月赛 202412【顽强拼搏奖的四种发法】题解(AC)
》》》点我查看「视频」详解》》》
[语言月赛 202412] 顽强拼搏奖的四种发法
题目描述
在 XCPC 竞赛里,会有若干道题目,一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的,当且仅当:
- 在本次提交以前,还未通过该题目。
- 本次提交的题目在比赛里最终被该队伍通过了。
注意,事实上,在通过一道题目后,一支队伍仍然可以提交该题目。这样的提交是无效提交,同时,无论这样的提交是否通过,都不会影响该队伍已通过该题目的状态。
我们按顺序给出本场比赛所有队伍的全部提交记录,每条记录是一个三元组 ( t i d i , p i d i , s t a t e i ) (tid_i, pid_i, state_i) (tidi,pidi,statei),其中 t i d i tid_i tidi 表示提交这条记录的队伍编号, p i d i pid_i pidi 表示这条记录所提交的题目编号, s t a t e i state_i statei 表示这条记录的状态是未通过/通过。
如果一支队伍在比赛里通过了至少 k k k 道不同的题目,则它们获得了奖牌。
你要求出本场比赛的顽强拼搏奖归属于哪支队伍。很遗憾的是,每个主办方对顽强拼搏奖的定义是不同的,因此你需要按如下四种计算方法分别计算获得顽强拼搏奖所归属的队伍编号:
- 最后一次 AC 记录所对应的队伍。
- 最后一次有效 AC 记录所对应的队伍。
- 未获得奖牌的队伍的最后一次有效 AC 提交对应的队伍。
- 最后一次使得一支队伍的通过题目数由 0 0 0 变成 1 1 1 的提交所对应的队伍。
输入格式
第一行是四个整数,依次表示记录数量
n
n
n,队伍数量
t
t
t,题目数量
p
p
p 和获得奖牌的题目数
k
k
k。
接下来
n
n
n 行,每行三个整数
t
i
d
i
,
p
i
d
i
,
s
t
a
t
e
i
tid_i, pid_i, state_i
tidi,pidi,statei,表示一次提交记录。其中
s
t
a
t
e
i
=
0
state_i=0
statei=0 表示本次提交未通过,
s
t
a
t
e
i
=
1
state_i = 1
statei=1 表示本次提交已通过。
我们认为后输入的提交记录的提交时间晚于先输入的提交记录提交时间。
输出格式
输出一行四个用空格隔开的整数,依次表示按这四种评奖方法评定,顽强拼搏奖所归属的队伍的编号。
如果按某种评定方法没有顽强拼搏奖队伍,在对应位置输出 − 1 -1 −1。
样例 #1
样例输入 #1
8 4 2 2
1 1 1
1 2 1
2 2 1
3 1 1
4 1 1
4 2 1
2 1 1
1 2 1
样例输出 #1
1 2 3 4
提示
样例 1 解释
这个样例共有 4 4 4 支队伍,两道题目。解出两道题目的队伍可以获奖。
- 整场比赛的最后一次 AC 提交是第八条记录, 1 1 1 号队伍提交第二题通过。因此第一种定义计算出的顽强拼搏奖是队伍 1 1 1;
- 队伍 1 1 1 在第二条记录时就已通过第二题,所以第八条记录不是一条有效提交记录。最后一条 AC 的有效提交记录是第七条。因此第二种定义计算出的顽强拼搏奖是队伍 2 2 2;
- 只有队伍 3 3 3 没有获奖,它们的最后一次提交是第四条记录,因此按第三种定义计算的顽强拼搏奖是队伍 3 3 3;
- 队伍 4 4 4 是最后一个通过题目数由 0 0 0 题变为 1 1 1 题的队伍。其对应的提交记录是第五条。因此按第四种定义计算的顽强拼搏奖是队伍 4 4 4。
数据规模与约定
测试点编号 | n n n | t t t | p p p | 特殊约定 |
---|---|---|---|---|
1 1 1 | = 1 =1 =1 | = 1 =1 =1 | = 1 =1 =1 | 无 |
2 , 3 2,3 2,3 | ≤ 100 \leq 100 ≤100 | = 1 =1 =1 | ≤ 100 \leq 100 ≤100 | 无 |
4 , 5 4,5 4,5 | ≤ 100 \leq 100 ≤100 | ≤ 100 \leq 100 ≤100 | = 1 =1 =1 | 无 |
6 , 7 6,7 6,7 | ≤ 1000 \leq 1000 ≤1000 | ≤ 100 \leq 100 ≤100 | ≤ 100 \leq 100 ≤100 | 一支队伍只会通过一道题至多一次 |
8 , 9 , 10 8,9,10 8,9,10 | ≤ 1000 \leq 1000 ≤1000 | ≤ 100 \leq 100 ≤100 | ≤ 100 \leq 100 ≤100 | 无 |
对全部的测试数据,保证 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1≤n≤1000, 1 ≤ t i d i ≤ t ≤ 100 1 \leq tid_i \leq t \leq 100 1≤tidi≤t≤100, 1 ≤ p i d i ≤ p ≤ 100 1 \leq pid_i \leq p \leq 100 1≤pidi≤p≤100, 1 ≤ k ≤ p 1 \leq k \leq p 1≤k≤p, 0 ≤ s t a t e i ≤ 1 0 \leq state_i \leq 1 0≤statei≤1。
AC_Code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 1e3 + 10;
int n, t, p, k;
bool st[N][N];
int cnt[N];
int a = -1, b = -1, c = -1, d = -1;
vector<int> q;
int main()
{
cin >> n >> t >> p >> k;
while (n -- )
{
int t, p, s;
cin >> t >> p >> s;
if (s)
{
a = t;
if (!st[t][p])
{
b = t;
cnt[t] ++;
q.push_back(t);
if (cnt[t] == 1)
d = t;
}
st[t][p] = true;
}
}
for (int i = q.size() - 1; i >= 0; -- i )
if (cnt[q[i]] < k)
{
c = q[i];
break;
}
cout << a << ' ' << b << ' ' << c << ' ' << d << endl;
return 0;
}
》》》点我查看「视频」详解》》》