A题:多国语言

思路:记录叫的次数和分别回应的次数, cnt 统计几次叫满(都回应了),k 统计几次至少回应了一次,对比即可。

代码:

#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
#include<bitset>
using namespace std;
const int N=1e5+5;
int n,m,T,cnt,a[N],b[N],v[N],num[N];
int main(){
    scanf("%d",&T);
    while(T--){
        memset(num,0,sizeof(num));
        memset(v,0,sizeof(v));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i){
            scanf("%d",&a[i]);
            ++num[a[i]];//num[a[i]]:该语言牛牛叫了多少次
        }
        for(int i=1;i<=n;++i){
            scanf("%d",&b[i]);
            if(b[i]==1) ++v[a[i]];//v[a[i]]:被回应的次数
        }
        int dire=0,k=0,cnt=0;
        for(int i=1;i<=m;++i)
            if(v[i]>0&&num[i]>0){
                ++k;//该种语言至少被回应了一次
                if(num[i]==v[i]) ++cnt,dire=i;//对该种语言每次都做出了回应
            }
        if(k>=2) printf("^v^\n");//猫对≥2种语言的叫声做出了回应
        else if(k==0) printf(">-<\n");//猫根本就不回应牛牛的任意一次叫声
        else {//对1种语言做出过回应
            if(cnt>0) printf("%d\n",dire);//对该种语言的每次叫声都做出回应
            else printf("^v^\n");//没有对每次该语言的叫声做出回应
        }
    }
    return 0;
}