本文同时发布于

博客园

洛谷博客

题目链接

题目分析

给你n个集合,每个集合里面都有可能会重复的数字

q个询问,每次询问两个数是否会在同一集合内

$n<=1000$

$q<=200000$


做法分析

算法一: $\mathcal{O}(nq)$ 的暴力做法

$vis[x][i]$ 表示 x 是否出现在第 i 个集合中,是为1,否为0

每一次询问枚举

算法二: 状态压缩压掉第二维

时间复杂度 $\mathcal{O}(n+q)$

但是 $n<=1000$ 范围会爆空间

具体做法:

vis[x] 表示 x 所包括的集合,如果 x 在第 i 个集合中出现,则第 i 位为1(二进制位)

储存操作: 第 i 个集合读到 x 时,则 vis[x]|=(1<<i)

查询操作: 查询 x 和 y 是否在同一集合内出现过,就是查询 vis[x]&vis[y] 是否为1

但是显然就算使用 unsigned long long 也经不过n<=1000的数据范围

参考Code:

#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
int vis[10010];
int n,q,c,x,y;
bool f;
inline int read()
{
int r=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9'){
r=(r<<3)+(r<<1)+(ch^48);
ch=getchar();
}
return r;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
c=read();
for(int j=1;j<=c;j++)
{
x=read();
vis[x]|=(1<<i);
}
}
q=read();
for(int i=1;i<=q;i++)
{
x=read();y=read();
if(vis[x]&vis[y])
puts("Yes");
else
puts("No");
}
return 0;
}

算法三: 用bitset对算法二进行优化

奇技淫巧bitset是一个极其好用的STL,类似于bool数组却比bool数组支持更多的操作,更快,占用空间更小

关于具体的bitset的各种操作珂以去网上找找

bitset在#include<bitset>头文件里

bitset<1010>vis[10010]这样就声明了10010个bitset

每一个bitset共有1010个bit,每个bit为1或0,初始都为0

bitset也支持按位与,按位或,按位异或,左移右移等操作等操作.

而且占用空间也小,一个bool是1byte,而bitset的一位只占1bit

时间复杂度$\mathcal{O}(n+q)$

参考Code:

#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
bitset<1010>tmp,vis[10010];
int n,q,c,x,y;
bool f;
inline int read()
{
int r=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9'){
r=(r<<3)+(r<<1)+(ch^48);
ch=getchar();
}
return r;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
c=read();
for(int j=1;j<=c;j++)
{
x=read();
vis[x][i]=1;//存入可以按正常的bool数组写
}
}
q=read();
for(int i=1;i<=q;i++)
{
x=read();y=read();
tmp=vis[x]&vis[y];
if(tmp.count()!=0)
puts("Yes");
else
puts("No");
}
return 0;
}

POJ 2443 Set Operation 题解的更多相关文章

  1. [POJ 2443] Set Operation (bitset)

    题目链接:http://poj.org/problem?id=2443 题目大意:给你N个集合,每个集合里有若干个数.M个查询,每个查询有a,b两个数.问是否存在一个集合同时包含a,b这两个数.若存在 ...

  2. POJ 2443 Set Operation

    Set Operation Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3558   Accepted: 1479 Des ...

  3. POJ 2443 Set Operation(压位加速)

    http://poj.org/problem?id=2443 题意: 有1000个集合,每个集合有至多10000个数,之后输入多个询问,判断询问的两个数是否位于同一个集合. 思路: 位运算...很强大 ...

  4. POJ 2443 Set Operation (按位压缩)

    Description You are given N sets, the i-th set (represent by S(i)) have C(i) element (Here "set ...

  5. POJ 2823 Sliding Window 题解

    POJ 2823 Sliding  Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...

  6. POJ 2443:Set Operation 经典位运算好题

    Set Operation Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2965   Accepted: 1196 Des ...

  7. POJ 2585 Window Pains 题解

    链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...

  8. Poj 1659.Frogs' Neighborhood 题解

    Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和 ...

  9. poj 3264 Balanced Lineup 题解

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Subm ...

随机推荐

  1. fiddler提示the system proxy was changed,Click to reanable capturing.导致无法抓包

    出现这个提示后,fiddler无法抓取请求. 在网上搜了很多方法,比较常见的解决办法如下: 方法1: 网络设置问题,既然是使用本地浏览器,那么只需要把IE浏览器的网络设置下: 面板上点击 Tools- ...

  2. day38 并发编程(理论)

    目录 一.操作系统发展史 二.多道技术 1 单核实现并发的效果 2 多道技术图解 3 多道技术重点 三.进程理论 1 必备知识点 2 进程调度 3 进程的三状态 4 两对重要概念 四.开启进程的两种方 ...

  3. day27 作业

    # 学校类 class School: #校区的名字:如"老男孩上海校区" #校区的地址:如"上海虹桥" def __init__(self,s_name,s_ ...

  4. 面向对象之多态(Java实现)

    本文借鉴于csdn,博客园,b站等各大知识分享平台 之前学习了封装与继承,封装就是数据的封装性(大致理解),继承就是一个类继承另一个类的属性,称为父子类 多态 多态是面向对象的第三大特性(共三大特性) ...

  5. Canonical通过Flutter启用Linux桌面应用程序支持

    子标题:Ubuntu团队为所有Linux发行版上的Flutter应用程序制作了一个新的基于GTK +的主机. 此文翻译自:https://medium.com/flutter/announcing-f ...

  6. JVM 专题十八:垃圾回收(二)垃圾回收相关算法

    1. 标记阶段 1.1 引用计数算法 1.1.1 对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己 ...

  7. 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版

    截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...

  8. Database Identifiers - SID

    These options include your global database name and system identifier (SID). The SID is a unique ide ...

  9. echarts 实战 : 图表竖着或横着是怎样判定的?

    这个问题比较简单. echarts 的图表默认是竖着的. 只要 xAxis 和 yAxis 互换,竖着的图就变成了横着的图了. 所以我们可以可以写一个xy轴互换的方法. reverseXYAxis = ...

  10. 【JVM之内存与垃圾回收篇】类加载子系统

    类加载子系统 概述 完整图如下: 如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件, ...