洛谷P3674 小清新人渣的本愿(莫队)
由乃tql……
然后抄了一波zcy大佬的题解
我们考虑把询问给离线,用莫队做
然后用bitset维护,每一位代表每一个数字是否存在,记为$now1$
然后再记录一个$now1$的反串$now2$(就是每一位代表的是$N-x$),干吗用等下说
1操作的话,因为每一个位置代表一个数字,如果存在$z-y=x$,可以转化为同时存在$z$和$z-x$,那么把$now1$左移$x$位并与$now1$做$\&$运算,看看是否等于$0$,如果不是说明不存在
2操作的话,$now2$中的$y'$代表数字$N-y$,然后求是否存在$z+y=x$,也就是求是否同时满足$now1$中有$z$和$now2$中有$y'$,带进前面的式子里,$N-y'+z=x,z-y'=x-N$,然后就转化成和上面一样了,那么只要把$now2$右移$N-x$位并与$now1$做$\&$运算就行了
3操作的话,我们可以考虑枚举约数(总共是$\sqrt {n}$个,时间足够),然后在$now1$里每一次查询即可
顺带一提,代码里bitset中的any返回是否有1
//minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<bitset>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
struct node{
int k,l,r,x,id;
}q[N+];
int m,n,l,r,s;
int a[N+],c[N+],ans[N+],rt[N+];
bitset<N+> now1,now2;
inline int operator <(node x,node y){
return rt[x.l]==rt[y.l]?rt[x.l]&?x.r<y.r:x.r>y.r:rt[x.l]<rt[y.l];
}
inline void init(){
n=read(),m=read(),s=sqrt(n);
for(int i=;i<=n;++i) a[i]=read(),rt[i]=(i-)/s+;
for(int i=;i<=m;++i){
q[i].k=read(),q[i].l=read(),q[i].r=read();
q[i].x=read(),q[i].id=i;
}
sort(q+,q++m);l=,r=;
}
inline void add(int x){if(c[x]++==)now1[x]=,now2[N-x]=;}
inline void del(int x){if(--c[x]==)now1[x]=,now2[N-x]=;}
int main(){
init();
for(int i=;i<=m;++i){
while(l<q[i].l) del(a[l++]);
while(l>q[i].l) add(a[--l]);
while(r>q[i].r) del(a[r--]);
while(r<q[i].r) add(a[++r]);
int k=q[i].k,x=q[i].x;
switch(k){
case :{
if((now1&(now1<<x)).any())
ans[q[i].id]=;
break;
}
case :{
if((now1&(now2>>(N-x))).any())
ans[q[i].id]=;
break;
}
case :{
for(int j=;j*j<=x;++j)
if(!(x%j))
if(now1[j]&&now1[x/j]){
ans[q[i].id]=;break;
}
break;
}
}
}
for(int i=;i<=m;++i)
puts(ans[i]?"hana":"bi");
return ;
}
洛谷P3674 小清新人渣的本愿(莫队)的更多相关文章
- 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]
传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...
- 洛谷P3674 小清新人渣的本愿
题意:多次询问,区间内是否存在两个数,使得它们的和为x,差为x,积为x. n,m,V <= 100000 解: 毒瘤bitset...... 假如我们有询问区间的一个桶,那么我们就可以做到O(n ...
- 洛谷 P3674 小清新人渣的本愿
想看题目的戳我. 我刚开始觉得这道题目好难. 直到我从Awson大佬那儿了解到有一个叫做bitset的STL,这道题目就很容易被解开了. 想知道这个神奇的bitset的戳我. 这个题目一看就感觉是莫队 ...
- P3674 小清新人渣的本愿 莫队+bitset
ennmm...bitset能过系列. 莫队+bitset \(\mathcal{O}(m\sqrt n + \frac{nm}{w})\) 维护一个正向的 bitset <N> mem ...
- P3674 小清新人渣的本愿
P3674 小清新人渣的本愿 一道妙不可言的题啊,,, 一看就知道是个莫队 考虑求答案 1号操作就是个大bitset,动态维护当前的bitset \(S\),把能取哪些值都搞出来,只要\(S\ and ...
- Bzoj2038/洛谷P1494 小Z的袜子(莫队)
题面 Bzoj 洛谷 题解 考虑莫队算法,首先对询问进行分块(分块大小为\(sqrt(n)\)),对于同一个块内的询问,按照左端点为第一关键字,右端点为第二关键字排序.我们统计这个区间内相同的颜色有多 ...
- 洛谷2709 小B的询问(莫队)
题面 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R] ...
- 【题解】Luogu P3674 小清新人渣的本愿
原题传送门 这题还算简单(我记得我刚学oi时就来写这题,然后暴力都爆零了) 看见无修改,那么这题应该是莫队 维护两个bitset,第二个是第一个的反串,bitset内维护每个数字是否出现过 第一种操作 ...
- luogu P3674 小清新人渣的本愿
传送门 毒瘤lxl 本质是莫队,关键是怎么处理询问 这里需要开两个bitset(记为\(b1,b2\)),分别存\(x\)和\(n-x\)是否出现 对于询问1,即\(x-y=z\),由于\(y=x-z ...
随机推荐
- 非常不错的LTE架构讲解
<LTE系统协议架构---通俗易懂超经典> <3GPP协议导读> <3GPP协议36211-850中文翻译> <LTE全套协议汇总> <NB-IO ...
- PostgreSQL 管理数据库
管理数据库每个正在运行的PostgreSQL 服务器实例都管理着一个或多个数据库.因此,在组织SQL对象(“数据库对象”)的层次中,数据库位于最顶层. 本章描述数据库的属性,以及如何创建.管理.删除它 ...
- handlebars中的partial
高级玩家:partial 比较推崇使用分页来实现组件化.分页跟helper一样需要先注册.在hbs模块中可以批量注册,比较简单. hbs.registerPartials(__dirname + '/ ...
- IC卡和RFID卡的区别(网上说的都不准确)
其实IC卡是卡类型的称呼,IC卡和RFID卡不应该在一起对比的,和IC卡在一起对比的应该是ID卡. RFID卡是其实是对卡技术类型称呼. IC为卡类型称呼(Integrated Circuit Car ...
- 空中楼阁 ( House )最短路
题目描述: 话说Z4阴差阳错地来到了神秘岛.不久,他们发现,这是一个由n个小岛和一个中心岛组成的群岛,群岛之间有m座桥.令他们感到惊讶的是,这些桥并不是固定不变的,经较长时间的观察,发现它们会随时间作 ...
- 关于RandomizedSearchCV 和GridSearchCV(区别:参数个数的选择方式)
# -*- coding: utf-8 -*- """ Created on Tue Aug 09 22:38:37 2016 @author: Administrato ...
- DAY17-Django之model查询
查询表记录 看专业的官网文档,做专业的程序员! 查询相关API <1> all(): 查询所有结果——QuerySet <2> filter(**kwargs): 它包含了与所 ...
- js实现鼠标拖拽
主要原理: 1.当鼠标按下时,记录鼠标坐标,用到的是 onmousedown: 2.当鼠标移动时,计算鼠标移动的坐标之差,用到的是 onmousemove: 3.当鼠标松开时,清除事件,用到的是 on ...
- Contset Hunter 1102 高精度求卡特兰数
用递推的方式写的写挂了,而如果用组合数又不会高精度除法,偶然看到了别人的只用高精度乘低精度求组合数的方法,记录一下 #include<bits/stdc++.h> using namesp ...
- Luogu 3292 [SCOI2016]幸运数字
BZOJ 4568. 感觉很板. 前置技能:线性基. 放一篇感觉讲的比较丰富的博客: 戳这里. 首先要求在一个序列中任意选点使得异或和最大,当然是想到线性基了. 把问题转换到树上,如果每次询 ...