洛谷-P5886 Hello, 2020!

洛谷-P5886 Hello, 2020!

原题链接:https://www.luogu.com.cn/problem/P5886


题目背景

时针与分针重合在「零」的那一霎那,嘀嗒声便宣告了新一年的到来。

在过去的一年里,世事无常。屏幕面前的你可能不久前才听闻「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;
}
posted @ 2020-08-15 09:06  yuzec  阅读(242)  评论(0编辑  收藏  举报