D. Cinema
time limit per test
1 second
memory limit per test
256 megabytes
input
input.txt
output
output.txt
Overall there are m actors in Berland. Each actor has a personal identifier — an integer from 1 to m (distinct actors have distinct identifiers). Vasya likes to watch Berland movies with Berland actors, and he has k favorite actors. He watched the movie trailers for the next month and wrote the following information for every movie: the movie title, the number of actors who starred in it, and the identifiers of these actors. Besides, he managed to copy the movie titles and how many actors starred there, but he didn't manage to write down the identifiers of some actors. Vasya looks at his records and wonders which movies may be his favourite, and which ones may not be. Once Vasya learns the exact cast of all movies, his favorite movies will be determined as follows: a movie becomes favorite movie, if no other movie from Vasya's list has more favorite actors.
Help the boy to determine the following for each movie:
- whether it surely will be his favourite movie;
- whether it surely won't be his favourite movie;
- can either be favourite or not.
Input
The first line of the input contains two integers m and k (1 ≤ m ≤ 100, 1 ≤ k ≤ m) — the number of actors in Berland and the number of Vasya's favourite actors.
The second line contains k distinct integers ai (1 ≤ ai ≤ m) — the identifiers of Vasya's favourite actors.
The third line contains a single integer n (1 ≤ n ≤ 100) — the number of movies in Vasya's list.
Then follow n blocks of lines, each block contains a movie's description. The i-th movie's description contains three lines:
- the first line contains string si (si consists of lowercase English letters and can have the length of from 1 to 10 characters, inclusive) — the movie's title,
- the second line contains a non-negative integer di (1 ≤ di ≤ m) — the number of actors who starred in this movie,
- the third line has di integers bi, j (0 ≤ bi, j ≤ m) — the identifiers of the actors who star in this movie. If bi, j = 0, than Vasya doesn't remember the identifier of the j-th actor. It is guaranteed that the list of actors for a movie doesn't contain the same actors.
All movies have distinct names. The numbers on the lines are separated by single spaces.
Output
Print n lines in the output. In the i-th line print:
- 0, if the i-th movie will surely be the favourite;
- 1, if the i-th movie won't surely be the favourite;
- 2, if the i-th movie can either be favourite, or not favourite.
Examples
input
Copy
5 3 1 2 3 6 firstfilm 3 0 0 0 secondfilm 4 0 0 4 5 thirdfilm 1 2 fourthfilm 1 5 fifthfilm 1 4 sixthfilm 2 1 0
output
Copy
2 2 1 1 1 2
input
Copy
5 3 1 3 5 4 jumanji 3 0 0 0 theeagle 5 1 2 3 4 0 matrix 3 2 4 0 sourcecode 2 2 4
output
Copy
2 0 1 1
Note
Note to the second sample:
- Movie jumanji can theoretically have from 1 to 3 Vasya's favourite actors.
- Movie theeagle has all three favourite actors, as the actor Vasya failed to remember, can only have identifier 5.
- Movie matrix can have exactly one favourite actor.
- Movie sourcecode doesn't have any favourite actors.
Thus, movie theeagle will surely be favourite, movies matrix and sourcecode won't surely be favourite, and movie jumanji can be either favourite (if it has all three favourite actors), or not favourite.
一共m个演员,有k个是它喜欢的会给出。接下来n个电影,每个电影都有xi个演员,根据演员来判断那一个电影肯定是它最喜欢、肯定是它不喜欢、不一定喜欢和不喜欢。
首先得求出一个电影拥有它喜欢演员的的最大值、最小值。分别为:
int getMax(node &a){return a.a+min(a.b,k-a.a);}
int getMin(node &a){return a.a+max(0,a.b-(m-k-a.c));}
其中a为肯定喜欢、b为不确定、c是肯定不喜欢的数量。
1、如果存在某个电影最小值>A的最大值,那么它肯定不是最大。
2、如果flag2==0,即不存在其他最大值大于A的最小值,肯定最大。
3、否则可能最大、肯能不最大。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1000+66;
const ll mod=1e9+7;
int m,k,n;
int vis[maxn];
struct node
{
int a;
int b;
int c;
}p[maxn];
int getMax(node &a){return a.a+min(a.b,k-a.a);}
int getMin(node &a){return a.a+max(0,a.b-(m-k-a.c));}
void ans(int x)
{
int flag1=0;
int flag2=0;
int minn=getMin(p[x]);
int maxx=getMax(p[x]);
for(int i=1;i<=n;i++)
{
if(i!=x)
{
node &x1=p[i];
int tmp=getMin(x1);
if(tmp>maxx)
flag1=1;//一定不是最大的
}
}
for(int i=1;i<=n;i++)
{
if(i!=x)
{
node &x1=p[i];
int tmp=getMax(x1);
if(tmp>minn)
flag2=1;
}
}
if(flag2==0)
{
printf("0\n");
}
else if(flag1)
{
printf("1\n");
}
else
{
printf("2\n");
}
return ;
}
int main()
{
//freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%d %d",&m,&k);
for(int i=1; i<=k; i++)
{
int x;
scanf("%d",&x);
vis[x]=1;
}
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int A=0,B=0,C=0;
char ch[100];
scanf("%s",ch);
int num;
scanf("%d",&num);
for(int j=1; j<=num; j++)
{
int x;
scanf("%d",&x);
if(vis[x])
{
A++;//确定喜欢
}
else if(x==0)
{
B++;//不确定的
}
else
{
C++;
}
}
p[i].a=A;
p[i].b=B;
p[i].c=C;
}
for(int i=1; i<=n; i++)
{
ans(i);
}
return 0;
}