【传送门:BZOJ4810】


简要题意:

  给出n个数,给出m种询问:

  1 l r x判断是否在区间l到r中能选出两个数的差为x

  2 l r x判断是否在区间l到r中能选出两个数的和为x

  3 l r x判断是否在区间l到r中能选出两个数的乘积为x

  其中选出的两个数可以相等


题解:

  肯定得离线

  用莫队吧(离线,第一时间就想到莫队)

  第三个询问可以暴力求因子搞一搞

  结果发现不会搞1和2

  上网搜了搜,学了一波bitset

  bitset简单来说可以当作一个二进制位来用,但是它并不需要二进制那样的庞大数据范围

  而且赋值只需要像数组一样赋值

  然后对于第1个操作,将当前bitset与当前的bitset向右移x位之后的bitset做一下and运算,假如有1,则说明成立

  然后对于第2个操作,将用第二个bitset作为第一个bitset的取反,然后用反转bitset右移后和正bitset做一下and运算,如果有1,则说明成立(这个东西,自己脑补,也挺容易理解的)


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<bitset>
using namespace std;
bitset<110000> bs1,bs2;
int a[110000];
int belong[110000];
struct node
{int opt,l,r,x,d,id;
}q[1100000];int n,m;
bool cmp1(node n1,node n2)
{if(belong[n1.l]<belong[n2.l]) return true;if(belong[n1.l]>belong[n2.l]) return false;if(belong[n1.l]==belong[n2.l]){if(n1.r<n2.r) return true;if(n1.r>n2.r) return false;}return false;
}
bool cmp2(node n1,node n2)
{return n1.id<n2.id;
}
int sum[110000];
void add(int x)
{sum[x]++;if(sum[x]==1) bs1[x]=1,bs2[n-x+1]=1;
}
void del(int x)
{sum[x]--;if(sum[x]==0) bs1[x]=0,bs2[n-x+1]=0;
}
int solve1(int x)
{if(((bs1)&(bs1>>x)).any()==true) return 1;else return 0;
}
int solve2(int x)
{if(((bs1)&(bs2>>(n-x+1))).any()==true) return 1;else return 0;
}
int solve3(int x)
{int t=int(sqrt(x+1));for(int i=1;i<=t;i++) if(x%i==0&&bs1[i]==1&&bs1[x/i]==1) return 1;return 0;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);int block=int(sqrt(n));for(int i=1;i<=n;i++){int t=(i-1)/block+1;belong[i]=t;}for(int i=1;i<=m;i++){scanf("%d%d%d%d",&q[i].opt,&q[i].l,&q[i].r,&q[i].x);q[i].id=i;}sort(q+1,q+m+1,cmp1);int l=1,r=0;memset(sum,0,sizeof(sum));bs1.reset();bs2.reset();for(int i=1;i<=m;i++){while(l>q[i].l){l--;add(a[l]);}while(l<q[i].l){del(a[l]);l++;}while(r>q[i].r){del(a[r]);r--;}while(r<q[i].r){r++;add(a[r]);}if(q[i].opt==1) q[i].d=solve1(q[i].x);if(q[i].opt==2) q[i].d=solve2(q[i].x);if(q[i].opt==3) q[i].d=solve3(q[i].x);}sort(q+1,q+m+1,cmp2);for(int i=1;i<=m;i++) if(q[i].d==1) printf("yuno\n"); else printf("yumi\n");return 0;
}

转载于:https://www.cnblogs.com/Never-mind/p/8551984.html

BZOJ4810: [Ynoi2017]由乃的玉米田相关推荐

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

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

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

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

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

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

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

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

  5. BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...

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

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

  7. 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze

    题目描述 去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移.这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发, ...

  8. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  9. acwing 327. 玉米田

    327. 玉米田 题意: m * n的土地,有的土地不育,有的可以种植,要求相邻的土地不能同时种植玉米,问有多少种种植方式 题解: 状压dp,先存每一行可能的状态,然后状态转移,注意相邻不能同时种植除 ...

最新文章

  1. go 方法接受者 是指针类型和非指针类型的 区别
  2. 从Wiesloch火车站到SAP Walldorf总部的交通方式
  3. plsql轻量版触发器
  4. dropbox离线安装版下载方法
  5. java spring获取bean_普通Java类获取Spring的Bean的方法
  6. 1064. Complete Binary Search Tree
  7. 图论复习(二)-——哈密顿图及其应用
  8. swift 选取图库中的图片
  9. 微信SDK删除支付模块流程
  10. 回顾展望:杀毒软件的“前世今生”
  11. Censored! :ac自动机 + DP
  12. Docker从入门到放弃
  13. Photoshop + ExifToolGUI 完美复制照片信息
  14. 彻底弄懂@Controller 、@Service、@Component
  15. 输入一行英文句子,统计其中的单词个数。例如,输入”How are you.”,则输出3。
  16. PL/SQL程序基础2
  17. 不要自己默默加班了!争取领导支援的五大实战话术
  18. 【已解决】HHC6003: 错误: 文件 Itircl.dll 没有被正确注册。怎么办?
  19. 如何搞垮一个测试团队?
  20. 忆阻器的概念和实现原理

热门文章

  1. MIT+IBM同时利用AI探索神经科学,让脑科学研究如虎添翼
  2. 系统学习机器学习之监督学习
  3. maya为什么不能导出fbx_Maya无法展 UV的解决办法
  4. mysql55w.x86 64 卸载_Cent6.5 64位yum安装mysql5.5
  5. linux sublime 输入中文,Linux中Sublime Text无法输入中文怎么办
  6. ueditor版本python3_GitHub - crazyinstall/DjangoUeditor3: Django Ueditor 兼容Python3改进,Python2上也可用...
  7. java websocket 库_Java 项目中的 WebSocket 实现
  8. 关于mysql和oracle错误的有_关于MySQL与Oracle的区别
  9. 手机算通用计算机还是,电脑手机通用的便签是哪个?有人知道吗
  10. python列表生成字典_Python 列表生成式 字典生成式