D. Cinema
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
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 0Output
2 2 1 1 1 2Input
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 4Output
2 0 1 1Note
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.
思路:
这题,如果切入点想错了,会变成一个巨复杂的大模拟,
但如果想到,求出每场演出最少可能最喜欢演员数和最大可能
演员数,就会变得非常简单,(求最小可能的时候用到了一点
容斥思想),然后再一个难点就是知道这两个量后怎么判断。
如果当前演出的最下数目<=其他每一个演出最大数目,则该
演出一定是最喜欢的演出,如果它的最大值小于某场演出的最小值,
那他一定不会是最喜欢的演出,其他情况均不可确定。
两个难点:切入点、结果逻辑 都不好想。。。
代码实现:
#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+100;
const int M=4e5+100;
int arr[N];
struct movie {
string name;
int maxs,mini;
int num;
void clearr() {
maxs=num=0;
mini=INF;
}
};
movie brr[N];
int main() {
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int m,k,n,x,like,tmp;
while(cin>>m>>k) {
tmp=0;
memset(arr,0,sizeof(arr));
for(int i=1; i<=k; i++) {
cin>>x;
arr[x]=1;
}
cin>>n;
for(int i=0; i<=n; i++)brr[i].clearr();
for(int i=1; i<=n; i++) {
cin>>brr[i].name>>brr[i].num;
tmp=like=0;
for(int j=1; j<=brr[i].num; j++) {
cin>>x;
if(arr[x]) {
like++;
}
if(x==0) {
tmp++;
}
}
brr[i].maxs=like+min(tmp,k-like);
brr[i].mini=like;
if(m-brr[i].num+tmp-k+like<tmp) {
brr[i].mini+=-m+brr[i].num+k-like;
}
}
for(int i=1; i<=n; i++) {
tmp=like=0;
for(int j=1; j<=n; j++) {
if(i!=j) {
if(brr[i].mini>=brr[j].maxs)like++;
if(brr[i].maxs<brr[j].mini)tmp++;
}
}
if(tmp) {
cout<<1<<endl;
} else if(like==n-1) {
cout<<0<<endl;
} else cout<<2<<endl;
}
}
return 0;
}
THE END;