打卡信奥刷题(495)用C++信奥P6479[普及组/提高] [CRCI2006-2007] BARD

[CRCI2006-2007] BARD

题目描述

有一个小村子,村子里共有 n n n 个人,不妨将这 n n n 个人从 1 1 1 n n n 编号,编号为 1 1 1 的人是诗人。

每天晚上都会有一些村民围在篝火旁唱歌。

如果某天晚上诗人来了,那么诗人会编一首所有人都没有听过的新歌曲并教给大家唱。在这天晚上不会唱其他任何歌曲

如果某天晚上诗人没来,那么与会者就会唱他们之中至少有一个人会唱的所有歌曲,并把这些歌曲教给那些来了但不会唱的人。

给定 m m m 天晚上参与唱歌的村民的编号,初始时村民们什么都不会唱,诗人一首歌也没有写。请输出最终有多少村民会唱诗人写的所有歌。

输入格式

第一行有一个整数,表示村民的数量 n n n

第二行有一个整数,表示夜晚的数量 m m m

3 3 3 到第 ( m + 2 ) (m + 2) (m+2) 行,每行描述一个夜晚,第 ( i + 2 ) (i + 2) (i+2) 行描述第 i i i 个晚上的情况:
该行首先有一个整数 k i k_i ki,表示该晚上来了 k i k_i ki 个村民,然后有 k i k_i ki 个互不相同的整数 a i , j a_{i, j} ai,j,分别表示来了的村民的编号。

输出格式

输出若干行,每行一个整数,以升序输出每一个会所有歌的村民的编号。

样例 #1

样例输入 #1

4
3
2 1 2
3 2 3 4
3 4 2 1

样例输出 #1

1
2
4

样例 #2

样例输入 #2

8
5
4 1 3 5 4
2 5 6
3 6 7 8
2 6 2
4 2 6 8 1

样例输出 #2

1
2
6
8

样例 #3

样例输入 #3

5
3
2 1 3
2 2 1
4 2 1 4 5

样例输出 #3

1

提示

数据规模与约定

对于全部的测试点,保证:

  • $ 1 \leq n \leq 100$, 1 ≤ m ≤ 50 1 \leq m \leq 50 1m50
  • 2 ≤ k i ≤ n 2 \leq k_i \leq n 2kin 1 ≤ a i , j ≤ n 1 \leq a_{i, j} \leq n 1ai,jn 1 1 1 a i , j a_{i, j} ai,j 中至少出现了一次。
说明

题目译自 COCI2006-2007 Regional Competition T1 BARD,翻译来自 @一扶苏一

C++实现

#include<bits/stdc++.h>
using namespace std;
int n,m,song[101][101],s,k,come[101],v[101];
int main()
{
cin>>n>>m;
for(int i=1,o=0;i<=m;i++,o=0){
cin>>k;
for(int j=1;j<=k;j++){
cin>>come[j];
if(come[j]1)o=1;
}
if(o) {
++s;
for(int j=1;j<=k;j++)
song[come[j]][s]=1;
}
else
{
for(int j=1;j<=k;j++)
for(int u=1;u<=s;u++)
if(song[come[j]][u])v[u]=1;
for(int j=1;j<=k;j++)
for(int u=1;u<=s;u++)
if(v[u])song[come[j]][u]=1;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=s&&song[i][j];j++)
if(j
s)cout<<i<<endl;
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值