2015广工新生赛 Problem A: GG和女神

来源:互联网 发布:知乎日报 吐槽精选 编辑:程序博客网 时间:2024/05/01 12:21

Problem A: GG和女神

Description

大家都知道,GG不仅长得帅,而且还长得帅,所以就连女神都喜欢他,这不,GG正打算跟女神出国旅游。女神觉得一定要选最好的衣服跟GG出去,给他留个好印象。所以女神打算在新买的n件衣服里面选k件带出国,所以她打算问她的好朋友xdlove,但是xdlove暂时没空回她,所以女神就自己选好了k件,把衣服标号写在了一个笔记本上。等xdlove闲下来找女神的时候,发现女神不在家里,只看到一堆衣服,有强迫症的他就把衣服按照价格从低到高排了序。这时刚吃完饭的女神就来了,看到被xdlove弄乱了的衣服,当然不高兴了,于是xdlove就跟她说,虽然我弄乱了,但我全都记得,然后跟女神说了k个编号之后说这就是你刚才选的k件(当然是假的)。GG知道了这件事之后,打算拆穿xdlove,毕竟他不容忍别人欺骗他的女神。于是他搜集了女神一开始的衣服价格序列,女神写了编号的笔记本,以及xdlove随口说的k个编号,现在他想知道xdlove说的K件衣服里面有多少件是女神挑好的,如果你能帮GG解决这个问题,那么他将会送你一个独家气球。

Input

第一行输入样例个数T(T<=20)。

每个样例格式如下
第一行两个数字n(1<=n<=1e6)和k(1<=k<=n),n,k如题目所述。
第二行是n件衣服价格vi,保证每个vi都不相同(vi<=1e17)
第三行,k个数字A1-An,代表女神笔记本上的k个编号。

第四行,k个数字B1-Bn,代表xdlove随口说的k个编号。

Output

每一个样例输出一个答案,换行

Sample Input

1
2 1
4 3
1
2

Sample Output

1

题解

表示一开始连题目都读不懂….
意思就是给你n个数,其中选了k个出来,可是后来被经过排序后,再告诉你k(下标)个数,问这k个中有多少个是原来选过的,数据量很大,如果普通的做法必然超时到死,那么自然想起了位运算…

输入n个数后把它们全部左移一位,原来的大小关系是不会改变的,然后选了的在末尾标志1,然后&1就知道是不是原来选过的了

代码

#include <cstdio>#include <queue>#include <cstring>#include <iostream>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <string>#include <set>#include <ctime>#include <cmath>#include <cctype>using namespace std;const int  MAX = 1e6+10;#define LL long longint cas=1,T;LL cloth[MAX];int main(){    scanf("%d",&T);    while (T--)    {        int n,k;        scanf("%d%d",&n,&k);        for (int i = 1;i<=n;i++)        {            scanf("%lld",&cloth[i]);            cloth[i]<<=1;        }        for (int i = 1;i<=k;i++)        {            int temp;            scanf("%d",&temp);            cloth[temp]|= 1;        }        sort(cloth+1,cloth+n+1);        int ans = 0;        for (int i = 1;i<=k;i++)        {            int temp;            scanf("%d",&temp);            /*if (cloth[temp]&1) //多加个判断也会超时..                ans+=1;*/            ans+=(cloth[temp]&1);        }        printf("%d\n",ans);        memset(cloth,0,sizeof(cloth));    }    //freopen("in","r",stdin);    //scanf("%d",&T);    //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);    return 0;}
0 0