BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)
【题目链接】 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)相关推荐
- BZOJ - 4810 [Ynoi2017]由乃的玉米田 莫队算法 + bitset 大暴力
大家都很强, 可与之共勉 . 4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MB Description 由乃在自己的农田边散 ...
- BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)
Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序 ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法
加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...
- 4810: [Ynoi2017]由乃的玉米田
4810: [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 464 Solved: 222 [Submit][St ...
- [bzoj 3594] [Scoi2014]方伯伯的玉米田
[bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1399 Solved: 627 [Submit][ ...
- BZOJ4810: [Ynoi2017]由乃的玉米田
[传送门:BZOJ4810] 简要题意: 给出n个数,给出m种询问: 1 l r x判断是否在区间l到r中能选出两个数的差为x 2 l r x判断是否在区间l到r中能选出两个数的和为x 3 l r x ...
- BZOJ4810 [Ynoi2017]由乃的玉米田
对每个区间维护一下这个区间每个数有没有,用bitset压一下,这个用莫队跑出来,然后就能判加减合不合法了 乘的话根号枚举一下就行了 #include<iostream> #include& ...
- BZOJ 4810 莫队+bitset
思路: 看完这道题根本没有思路啊.... 然后我就膜拜了一波题解... 这神tm乱搞思路 维护两个bitset 第一个bitset代表当前区间哪些数出现过 第二个bitset是 maxp-p出现过 差 ...
最新文章
- Java学习总结:37(比较器)
- bpython使用_使用Python实现一个简单的A/B测试
- Bootstrap~多级导航(级联导航)的实现
- ceph学习之pool
- leetcode336. 回文对(字典树)
- Linux系统中安装软件的三种方法(一)
- spring中定时器的使用
- 安装CentOS 6/7
- Java-Scala编程规范超精简
- Linux debian利用ifconfig查看IP地址
- ccproxy使用指南
- 破解软件的原理是什么(软件被破解公开)
- 网络安全:图片隐藏攻击
- 校园就业季落幕:大数据就业不愁 养老人才抢手
- springboot影院售票小程序毕业设计源码111154
- Oracle安装 - Win7
- 【已补蓝奏云链接】PyTorch中MNIST数据集(附datasets.MNIST离线包)下载慢/安装慢的解决方案
- php空间自动发邮件,PHP 发送QQ邮件【实例】
- 1.6W Star 的「黑魔法」,非常实用!
- Codeforces Round #663 (Div. 2) A-D
热门文章
- 1.3编程基础之算术表达式与顺序执行 09 与圆相关的计算
- 华为 HarmonyOS2.0(鸿蒙OS) 开发者beta公测招募的报名流程
- 拼接的html点击事情不触发,关于在vue中拼接html的问题,点击事件无法执行
- Linux笔记-SVN(subversion)创建仓库及客户端连接及文件回滚
- canvas笔记-canvas加载图片及放缩及加水印(两canvas同时使用)
- Linux学习笔记-生成动态库(补充说明)
- Vmware工作笔记-通过光驱位与虚拟机(Vmware)共享数据【含iso制作】
- Windows下,使用dumpcpp 方式访问 COM 接口的方法
- android 360旋转动画,ANDROID——仿360手机卫士的旋转打分控件
- oracle pdb还原为no-cdb,oracle 12c中CDB和PDB的备份还原实验