luogu

题意

给你一个序列a,长度为n,有m次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别为操作1,2,3

选出的这两个数可以是同一个位置的数

所有数据\(\le 10^5\)

sol

正好今天考试一道题要用到\(bitset\)就跑过来写一下。

所谓\(bitset\)其实就是一个不用手写的压位,一般用来优化暴力,复杂度\(O(\frac{n^2}{64})\)哈。(毕竟很多时候除个\(64\)复杂度就可以过了)

这个题哈。用莫队的方法离线处理每个询问,把每种数字出现的集合压进一个\(bitset\)。对于减法就直接用SS>>x取交集判断是否为空。对于加法我们需要额外维护一个反过来的\(bitset\),然后也是右移一下然后取个交。

对于乘法,可以直接枚举因数判断是否存在即可。

复杂度\(O(\frac{n^2}{64}+n\sqrt n+m\sqrt n)\),所以说这是一个正确的复杂度。

莫队可以加一些优化,比如说对右端点排序的时候根据左端点所在块的奇偶性从大到小或者是从小到大排序。(还是快了蛮多的)

code

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<bitset>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1e5;
int n,m,blk,a[N+5],cnt[N+5],ans[N+5];
struct query{
int opt,l,r,x,id;
bool operator < (const query &b) const
{
if (l/blk!=b.l/blk) return l/blk<b.l/blk;
return ((l/blk)&1)?r>b.r:r<b.r;
}
}q[N+5];
bitset<N+5>S1,S2;
void add(int x)
{
++cnt[x];
if (cnt[x]==1) S1[x]=1,S2[N-x]=1;
}
void del(int x)
{
--cnt[x];
if (cnt[x]==0) S1[x]=0,S2[N-x]=0;
}
int main()
{
n=gi();m=gi();blk=sqrt(n);
for (int i=1;i<=n;++i) a[i]=gi();
for (int i=1;i<=m;++i) q[i]=(query){gi(),gi(),gi(),gi(),i};
sort(q+1,q+m+1);
int L=1,R=0;
for (int i=1;i<=m;++i)
{
while (R<q[i].r) add(a[++R]);
while (L>q[i].l) add(a[--L]);
while (R>q[i].r) del(a[R--]);
while (L<q[i].l) del(a[L++]);
if (q[i].opt==1)
ans[q[i].id]=(S1&(S1>>q[i].x)).any();
if (q[i].opt==2)
ans[q[i].id]=(S1&(S2>>N-q[i].x)).any();
if (q[i].opt==3)
for (int j=1;j*j<=q[i].x;++j)
if (q[i].x%j==0)
if (S1[j]&&S1[q[i].x/j]) {ans[q[i].id]=1;break;}
}
for (int i=1;i<=m;++i) puts(ans[i]?"hana":"bi");
return 0;
}

最新文章

  1. 不到一百行实现一个小siri
  2. USB设备(移动硬盘、鼠标)掉电掉驱动的两种解决方案
  3. javaWeb项目部署到阿里云服务器步骤
  4. 表格table嵌套,边框合并问题
  5. usefull-url
  6. discuz二次开发之后导航无法高亮 $mnid == $nav[navid]解决办法(转)
  7. HDU 2209 翻纸牌游戏 状态BFS
  8. MyBatis学习总结_06_调用存储过程
  9. 《Java数据结构与算法》笔记-CH1
  10. 九度OJ 1528 最长回文子串 -- Manacher算法
  11. Code Generation and T4 Text Templates
  12. js获取当前日期,网页头部用
  13. 程序员 10Tips
  14. 深入理解Java内置锁和显式锁
  15. WPF 外发光效果
  16. java 提取目录下所有子目录的文件到指定位置
  17. 【python-appium】模拟手机按键搜索异常
  18. Finding Lines UVALive - 6955(随机)
  19. python之读写文件
  20. 字典取KEY,占位符,延迟刷新

热门文章

  1. pyhton3 hashlib模块
  2. 31 整数中1出现的次数(从1到n整数中1出现的次数)
  3. Linux doxygen的安装与使用
  4. 跨平台移动开发 App-Framework DEMO 演示
  5. OC_内存管理
  6. kubernetes liveness readiness
  7. linux设置系统时间与时区以及设置bios时间同步系统时间
  8. 利用Phoenix为HBase创建二级索引
  9. intellij idea build时出现Artifact contains illegal characters的解决
  10. 0.00-050613_Makefile