您的位置:首页 > 其它

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

2015-12-10 17:25 239 查看

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 long
int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: