乌鸦坐飞机
Problem F: 乌鸦坐飞机
Time limit: 2 Sec Memory Limit: 128 MB
Submit: 140 Solved: 19
[Submit][Status][Web Board]
Description
社会我福哥,为了揍成龙去玩了玩集合。
有
有
Input
多组测试数据
第一行一个
接下来
第
接下来
Output
每组数据输出
Sample Input
3
3 1 2 3
3 1 2 5
1 10
4
1 3
1 5
3 5
1 10
Sample Output
Yes
Yes
No
No
[分析]
一开始开arr记录每个集合的数字,然后每次遍历每个集合,超时了。
然后观察了一下数据,发现m和num都挺小的,而且memory给了128M
所以思路就清晰了。
询问次数有6位数,一定要减少遍历的次数。
所以不能遍历所有的集合。既然找的是a和b都存在的集合,那为什么不在有a的集合中看看有没有b呢?
所以在输入的时候不经要保存某个组有哪些数字,还要保存某个数字在那些组中出现过。
之后的事情就简单了,遍历有a的集合,看看有没有b,有yes,没有no。
[后记]
ac之后还做了一个优化,就是当有a的集合较多时,遍历有b的集合找a
(就是代码中交换的一部分),但是只优化了十多毫秒。
[代码]
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
int n, cnt, wen, a, b;
int arr[1005][10005];
while (scanf("%d", &n) != EOF)
{
vector<int>v[10005];
memset(arr, 0, sizeof(arr));
for (int i = 0; i < n; i++)
{
scanf("%d", &cnt);
for (int j = 0; j < cnt; j++)
{
int x;
scanf("%d", &x);
arr[i][x]++;
v[x].push_back(i);
}
}
scanf("%d", &wen);
for (int i = 0; i < wen; i++)
{
scanf("%d%d", &a, &b);
if (v[a].size() > v[b].size())
{
int c = a;
a = b;
b = c;
}
if (v[b].size() == 0)goto out1;
for (int j = 0; j < v[a].size(); j++)
{
if (arr[v[a][j]][b] > 0)
{
printf("Yes\n");
goto out;
}
}
out1:;
printf("No\n");
out:;
}
}
}
文章最后发布于: 2017-08-14 18:44:00
相关阅读
图片来源图虫:已授站长之家使用声明:本文来自于微信公众号运营研究社公众号(ID:U_quan),作者:陈维贤,授权站长之家转载发布。文章整理自
与E1000E和E1000相比,VMXNET3的网络性能更好。本文将解释虚拟网络适配器和第2部分之间的区别,并将演示通过选择半虚拟化适配器可以
我们生活中所说的真无线耳机其实就是两个“耳塞”,主体没有任何的可见线材,索尼真无线蓝牙降噪耳机WF-1000XM3就是如此
2018家用显示器多大好 6款1000左右23-27英寸显示器推
现在千元左右就能买到2K显示器了,但对于家庭用户来说,2K分辨率还是太超前了。一方面,千元左右的2K产品多是23英寸产品,点距太小用着会
这两天拜读了吴建斌的“我在碧桂园的1000天”,记录下几段自己觉得好的文字: “作为成功的企业都十分重视管理、业务及技术学习。所