【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4810

【题目大意】

  给出一个数列,有三种区间查询,
  分别查询区间是否存在两个数乘积为x,是否存在两个数和为x,以及是否存在两个数差为x,

【题解】

  我们对于询问进行莫队处理,保存当前区间的权值数组,记为F,
  同时保存权值数组的反向数组G
  那么存在差为x的情况只要存在一组F[i]&F[i-x]=1即可
  存在和为x的情况只要存在一组F[i]&G[M-x+i]即可。
  对于乘积为x的情况,我们枚举x的约数,判断F[i]&F[x/i]是否存在。
  复杂度O(nsqrt(n)+nm/w)

【代码】

#include <cstdio>
#include <algorithm>
#include <bitset>
#include <cmath>
using namespace std;
const int N=100010,M=100000;
int limit,n,m,pos[N],a[N],ans[N],cnt[N];
bitset<N> F,G;
struct Q{int l,r,x,id,op;friend bool operator < (const Q &a,const Q &b){return pos[a.l]<pos[b.l]||(pos[a.l]==pos[b.l]&&a.r<b.r);}
}ask[M];
int read(int &x){int f=1;char ch=getchar();x=0;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x*=f;
}
int main(){read(n); read(m);limit=(int)sqrt(n+0.5);for(int i=1;i<=n;i++)read(a[i]),pos[i]=(i-1)/limit+1;for(int i=1;i<=m;i++)read(ask[i].op),read(ask[i].l),read(ask[i].r),read(ask[i].x),ask[i].id=i;sort(ask+1,ask+m+1);for(int i=1,l=1,r=0;i<=m;i++){for(;r<ask[i].r;r++)cnt[a[r+1]]++,F.set(a[r+1]),G.set(M-a[r+1]);for(;l>ask[i].l;l--)cnt[a[l-1]]++,F.set(a[l-1]),G.set(M-a[l-1]);for(;l<ask[i].l;l++){cnt[a[l]]--;if(!cnt[a[l]])F.reset(a[l]),G.reset(M-a[l]);}for(;r>ask[i].r;r--){cnt[a[r]]--;if(!cnt[a[r]])F.reset(a[r]),G.reset(M-a[r]);}if(ask[i].op==1){if((F&(F>>ask[i].x)).any())ans[ask[i].id]=1;}else if(ask[i].op==2){if((F&(G>>(M-ask[i].x))).any())ans[ask[i].id]=1;}else{for(int j=1;j*j<=ask[i].x;j++)if(ask[i].x%j==0){if(F[j]&F[ask[i].x/j]){ans[ask[i].id]=1;break;}}}}for(int i=1;i<=m;i++)puts(ans[i]?"yuno":"yumi");return 0;
}

转载于:https://www.cnblogs.com/forever97/p/bzoj4810.html

BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)相关推荐

  1. BZOJ - 4810 [Ynoi2017]由乃的玉米田 莫队算法 + bitset 大暴力

    大家都很强, 可与之共勉 . 4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MB Description 由乃在自己的农田边散 ...

  2. BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序 ...

  3. BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法

    加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...

  4. 4810: [Ynoi2017]由乃的玉米田

    4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 464  Solved: 222 [Submit][St ...

  5. [bzoj 3594] [Scoi2014]方伯伯的玉米田

    [bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...

  6. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  7. BZOJ4810: [Ynoi2017]由乃的玉米田

    [传送门:BZOJ4810] 简要题意: 给出n个数,给出m种询问: 1 l r x判断是否在区间l到r中能选出两个数的差为x 2 l r x判断是否在区间l到r中能选出两个数的和为x 3 l r x ...

  8. BZOJ4810 [Ynoi2017]由乃的玉米田

    对每个区间维护一下这个区间每个数有没有,用bitset压一下,这个用莫队跑出来,然后就能判加减合不合法了 乘的话根号枚举一下就行了 #include<iostream> #include& ...

  9. BZOJ 4810 莫队+bitset

    思路: 看完这道题根本没有思路啊.... 然后我就膜拜了一波题解... 这神tm乱搞思路 维护两个bitset 第一个bitset代表当前区间哪些数出现过 第二个bitset是 maxp-p出现过 差 ...

最新文章

  1. Java学习总结:37(比较器)
  2. bpython使用_使用Python实现一个简单的A/B测试
  3. Bootstrap~多级导航(级联导航)的实现
  4. ceph学习之pool
  5. leetcode336. 回文对(字典树)
  6. Linux系统中安装软件的三种方法(一)
  7. spring中定时器的使用
  8. 安装CentOS 6/7
  9. Java-Scala编程规范超精简
  10. Linux debian利用ifconfig查看IP地址
  11. ccproxy使用指南
  12. 破解软件的原理是什么(软件被破解公开)
  13. 网络安全:图片隐藏攻击
  14. 校园就业季落幕:大数据就业不愁 养老人才抢手
  15. springboot影院售票小程序毕业设计源码111154
  16. Oracle安装 - Win7
  17. 【已补蓝奏云链接】PyTorch中MNIST数据集(附datasets.MNIST离线包)下载慢/安装慢的解决方案
  18. php空间自动发邮件,PHP 发送QQ邮件【实例】
  19. 1.6W Star 的「黑魔法」,非常实用!
  20. Codeforces Round #663 (Div. 2) A-D

热门文章

  1. 1.3编程基础之算术表达式与顺序执行 09 与圆相关的计算
  2. 华为 HarmonyOS2.0(鸿蒙OS) 开发者beta公测招募的报名流程
  3. 拼接的html点击事情不触发,关于在vue中拼接html的问题,点击事件无法执行
  4. Linux笔记-SVN(subversion)创建仓库及客户端连接及文件回滚
  5. canvas笔记-canvas加载图片及放缩及加水印(两canvas同时使用)
  6. Linux学习笔记-生成动态库(补充说明)
  7. Vmware工作笔记-通过光驱位与虚拟机(Vmware)共享数据【含iso制作】
  8. Windows下,使用dumpcpp 方式访问 COM 接口的方法
  9. android 360旋转动画,ANDROID——仿360手机卫士的旋转打分控件
  10. oracle pdb还原为no-cdb,oracle 12c中CDB和PDB的备份还原实验