点此看题面

大致题意: 给你一段序列,每次询问一段区间内是否存在两个数的差或和或积为\(x\)。

莫队算法

看到区间询问+可以离线,首先想到了莫队啊。

但是,在较短的时间内更新信息依然比较难以实现。

于是,我们就要考虑用\(bitset\)了。

关于\(bitset\)

这应该是我第一次使用\(bitset\)吧,所以简单介绍一下它的使用方式。

其作用就相当于存储一个特别大的二进制数。可以把它看成一个\(bool\)数组来使用。

它的好处就在于,它可以直接进行\(\&,|,\text{^},<<,>>\)等各种位运算操作。

它有一个比较常用的函数:\(any()\),用于判断该\(bitset\)是否有某个元素值为\(1\)。

另外,还有一个函数\(count()\)是统计有几个\(1\)。

实际上,了解了这些,我们就可以用\(bitset\)来做这题了。

大致思路

考虑开两个\(bitset\):\(s1\)和\(s2\),其中\(s1_i\)表示值为\(i\)的元素是否存在,\(s2_i\)表示值为\(N-i\)的元素是否存在。

这样一来,似乎就不难处理差值的操作了,答案就是\((s1\&(s1<<x)).any()\),这还是比较好理解的,即判断是否有一个数和比它大\(x\)的数同时存在。

同理可得,和的操作答案就是\((s1\&(s2>>N-x)).any()\)。

对于积的操作就略麻烦了一点,需要枚举因数\(j\),然后判断\(j\)和\(\frac xj\)是否同时存在即可,这个操作是\(O(\sqrt x)\)的。

具体实现可见代码。

代码

#include<bits/stdc++.h>
#define N 100000
#define abs(x) ((x)<0?-(x):(x))
using namespace std;
int n,query_tot,a[N+5];
class Class_FIO
{
private:
#define Fsize 100000
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,Fsize,stdin),A==B)?EOF:*A++)
char ch,*A,*B,Fin[Fsize];
public:
Class_FIO() {A=B=Fin;}
inline void read(int &x) {x=0;while(!isdigit(ch=tc()));while(x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));}
}F;
class Class_CaptainMotao//莫队
{
private:
int block_size,ans[N+5],cnt[N+5];bitset<N+5> s1,s2;
inline void Add(int x) {if(!cnt[a[x]]++) s1[a[x]]=s2[N-a[x]]=1;}//新加一个元素
inline void Del(int x) {if(!--cnt[a[x]]) s1[a[x]]=s2[N-a[x]]=0;}//删除一个元素
public:
struct Query
{
int l,r,val,op,pos,bl;
inline friend bool operator < (Query x,Query y) {return x.bl^y.bl?x.bl<y.bl:(x.bl&1?x.r<y.r:x.r>y.r);}
}q[N+5];
inline void Solve()
{
int i,j,L=1,R=0;
for(block_size=sqrt(n),i=1;i<=query_tot;++i) F.read(q[i].op),F.read(q[i].l),F.read(q[i].r),F.read(q[i].val),q[q[i].pos=i].bl=(q[i].l-1)/block_size+1;//读入
for(L=1,R=0,sort(q+1,q+query_tot+1),i=1;i<=query_tot;++i)
{
while(R<q[i].r) Add(++R);while(L>q[i].l) Add(--L);while(R>q[i].r) Del(R--);while(L<q[i].l) Del(L++);
switch(q[i].op)
{
case 1:ans[q[i].pos]=(s1&(s1<<q[i].val)).any();break;//对于差的操作
case 2:ans[q[i].pos]=(s1&(s2>>N-q[i].val)).any();break;//对于和的操作
case 3:for(j=1;1LL*j*j<=q[i].val&&!ans[q[i].pos];++j) !(q[i].val%j)&&s1[j]&&s1[q[i].val/j]&&(ans[q[i].pos]=1);break;//对于积的操作
}
}
for(i=1;i<=query_tot;++i) puts(ans[i]?"yuno":"yumi");//输出答案
}
}C;
int main()
{
register int i;
for(F.read(n),F.read(query_tot),i=1;i<=n;++i) F.read(a[i]);
return C.Solve(),0;
}

【BZOJ4810】[YNOI2017] 由乃的玉米田(莫队+bitset)的更多相关文章

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

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

  2. bzoj4810 [Ynoi2017]由乃的玉米田 莫队+bitset(+数论)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4810 题解 看数据范围和题目名字应该是根号算法. 因为询问除了区间外,还有第 \(3\) 个参 ...

  3. 【bzoj4810】[Ynoi2017]由乃的玉米田 莫队算法+STL-bitset

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

  4. bzoj4810 [Ynoi2017]由乃的玉米田 bitset优化+暴力+莫队

    [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 917  Solved: 447[Submit][Status][Di ...

  5. LuoguP3674 小清新人渣的本愿 && BZOJ4810: [Ynoi2017]由乃的玉米田

    题目地址 小清新人渣的本愿 [Ynoi2017]由乃的玉米田 所以这两题也就输出不一样而已 题解 这种lxl的题还是没修改操作的题基本就是莫队 分开考虑每个询问 1.减法 \(a-b=x⇒a=b+x\ ...

  6. BZOJ4810 Ynoi2017由乃的玉米田(莫队+bitset)

    多组询问不强制在线,那么考虑莫队.bitset维护当前区间出现了哪些数,数组记录每个数的出现次数以维护bitset.对于乘法,显然应有一个根号范围内的因子,暴力枚举即可.对于减法,a[i]-a[j]= ...

  7. bzoj4810 [Ynoi2017]由乃的玉米田

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

  8. 【BZOJ4810】[Ynoi2017]由乃的玉米田 bitset+莫队

    [BZOJ4810][Ynoi2017]由乃的玉米田 Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.由乃认为玉米田不美,所 ...

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

    Time Limit: 30 Sec  Memory Limit: 256 MB Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差 ...

  10. P3674 小清新人渣的本愿 莫队+bitset

    ennmm...bitset能过系列. 莫队+bitset \(\mathcal{O}(m\sqrt n + \frac{nm}{w})\) 维护一个正向的 bitset <N> mem ...

随机推荐

  1. vue里的tab标签

    <template> <div class="Test2"> <div class="tabs_wrap" v-model=&qu ...

  2. uva 1614奇怪的股市(归纳法证明,贪心)

    uva 1614奇怪的股市(归纳法证明,贪心) 输入一个长度为n的序列a,满足\(1\le a_i\le i\),要求确定每个数的正负号,使得所有数的总和为0.例如a={1, 2, 3, 4},则4个 ...

  3. 洛谷P2580(trie)

    第一行一个整数 n,表示班上人数.接下来 n 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50).第 n+2 行一个整数 m,表示教练报的名字.接下来 m 行,每行一个字符串表 ...

  4. DMZ的原理与应用

    DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓 ...

  5. win10移动热点问题

    1.问题(win10移动热点相关) 具体描述: win10通过网线连接上网,打开移动热点后手机无法连接. 如下图所示,win10打开热,然后进入设置界面设置wlan名称和密码,手机填好密码,连接热点发 ...

  6. 关于递归函数返回值为null的问题

    public function gettopcateid($cate_id){ $pid=db('cate')->where('cate_id',$cate_id)->find(); if ...

  7. ELK系列(2) - Kibana怎么修改日期格式Date format

    问题 Kibana在创建Index Patterns的时候,可以选择某个date类型的field作为排序字段.之后在Discover里打开对应的index,会发现这个date类型的field的格式显示 ...

  8. $.store.book[?(@.title =~ /^.*Honour.*$/i)]

    { "store": { "book": [ { "category": "reference", "auth ...

  9. Storm概念学习系列之storm-starter项目(完整版)(博主推荐)

    不多说,直接上干货! 这是书籍<从零开始学Storm>赵必厦 2014年出版的配套代码! storm-starter项目包含使用storm的各种各样的例子.项目托管在GitHub上面,其网 ...

  10. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录

    一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...