洛谷-P5886 Hello, 2020!
洛谷-P5886 Hello, 2020!
题目背景
时针与分针重合在「零」的那一霎那,嘀嗒声便宣告了新一年的到来。
在过去的一年里,世事无常。屏幕面前的你可能不久前才听闻「OI」,也可能暂时地结束了竞赛生涯;可能在赛场上叱咤风云名列榜首,也可能独自承受着比赛失利的落寞。
无论如何,过去仍旧是过去,将来依然是将来。
以此题为开端,迎接你的 2020 吧!
题目描述
本场比赛有 \(n\) 名出题人,\(m\) 名选手。
出题人从 \(1\) 至 \(n\) 依次标号,选手从 \(1\) 至 \(m\) 依次标号。
比赛结束后选手的最终排名为 \(1\) 至 \(m\) 中其一,且互不相同。
报名结束后,第 \(i\) 位出题人看了看报名列表,对其他出题人说:「我觉得只有这 \(k_i\) 位选手有可能最终排名第一,他们分别是 \(a_{i,1},a_{i,2},\dots,a_{i,k_i}\)。其他人不可能最终排名第一。」
你面前屏幕上的这道题的出题人通过时空隧道,预先得知了谁是最终排名第一的选手。
出题人把这 \(n\) 位出题人的预测都告诉了你,还告诉你恰好只有 \(p\) 个出题人的预测是正确的。
请你求出哪些选手可能最终获得第一名,并以从小到大的顺序依次输出这些选手的编号。
输入格式
从标准输入中读取数据。
第一行,三个正整数 \(n,m,p\),表示出题人数,选手数,与正确预测数。
接下来 \(n\) 行,每行第一个非负整数 \(k_i\) 表示第 \(i\) 位出题人预测可能最终排名第一的选手位数;接下来 \(k_i\) 个正整数 \(a_{i,1},a_{i,2},\dots,a_{i,k_i}\),表示这位出题人预测可能最终排名第一的选手编号。
输出格式
输出数据至标准输出中。
第一行,输出一个非负整数,表示可能最终获得第一名的选手个数。
第二行,以从小到大的顺序依次输出这些选手的编号。
输入输出样例
输入 #1
4 3 2
2 2 3
1 1
3 1 2 3
2 1 3
输出 #1
1
2
说明/提示
子任务 1(\(6\%\)):\(n\leq 20\),\(m\leq 20\)。
子任务 2(\(30\%\)):\(n\leq 100\),\(m\leq 100\),\(\sum k_i \leq 10^4\)。
子任务 3(\(24\%\)):\(n\leq 1000\),\(m\leq 1000\)。
子任务 4(\(40\%\)):无特殊限制。
对于全部数据,\(1\leq n\leq 10^5\),\(1\leq m\leq 10^6\),\(0\leq \sum k_i \leq 10^6\),\(0\leq p\leq n\)。
C++代码
#include <iostream>
using namespace std;
int main() {
int n, m, p, t, count=0;
cin >> n >> m >> p;
int k[n], a[m+1]={0}, ans[m];
for (int i=0; i<n; ++i) {
cin >> k[i];
for (int j=0; j<k[i]; ++j) {
cin >> t;
++a[t];
}
}
for (int i=1; i<=m; ++i)
if (a[i] == p)
ans[count++] = i;
cout << count << endl;
for (int i=0; i<count; ++i)
cout << ans[i] << ' ';
cout << endl;
return 0;
}