给你一个序列a,长度为n,有m次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别为操作1,2,3

对于操作3,我们可以很容易通过枚举约数得到。
离线操作,考虑莫队
对于操作1,询问实际上问的就是区间是否存在a和x-a,因为数据范围较小,用bitset维护每个值
对于操作2,考虑一个较大值 m a x n maxn maxn ,根据 ( m a x n − i ) − ( m a x n − k ) = ( k − i ) (maxn-i)-(maxn-k)=(k−i) (maxn−i)−(maxn−k)=(k−i),维护 m a x n − a [ i ] maxn-a[i] maxn−a[i]即可

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define de(c) cout << #c << " = " << c << endl
#define dd(c) cout << #c << " = " << c << " "
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int maxn = 1e5+50;bitset<maxn+50> s1,s2;
struct query { int L, R, id,op,val; } q[maxn];
int ans[maxn+50];
int a[maxn+50];
int cnt[maxn+50];
int n,m,unit;void add(int x)
{cnt[a[x]]++;if(cnt[a[x]] == 0)s1[a[x]] = s2[maxn-a[x]] = cnt[a[x]];elses1[a[x]] = s2[maxn-a[x]] = 1;
}void del(int x)
{cnt[a[x]]--;if(cnt[a[x]] == 0)s1[a[x]] = s2[maxn-a[x]] = cnt[a[x]];elses1[a[x]] = s2[maxn-a[x]] = 1;
}void solve(query node[], int m)
{memset(ans, 0, sizeof(ans));s1.reset();s2.reset();memset(cnt, 0, sizeof(cnt));sort(node+1, node + m+1, [](query a, query b) {if(a.L / unit == b.L / unit){return a.R < b.R;}return a.L < b.L;});// rep(i,1,m+1)// {//     dd(node[i].L),dd(node[i].R),dd(node[i].id),dd(node[i].op),de(node[i].val);// }int L = 1, R = 0;for (int i = 1; i < m+1; i++){while (node[i].L > L) del(L++);while (node[i].L < L) add(--L);while (node[i].R > R) add(++R);while (node[i].R < R) del(R--);// dd(L),de(R);if(node[i].op == 1){ans[node[i].id] = (s1&(s1<<node[i].val)).any();}else if(node[i].op == 2){ans[node[i].id] = (s1&(s2>>(maxn-node[i].val))).any();   }else{for(int j=1;j*j<=node[i].val;j++) if(node[i].val % j ==0){// de(s1[4]);if(s1[j] && s1[node[i].val/j]) {ans[node[i].id]=1;}}}// ans[node[i].id] = tmp;}
}int main(int argc, char const *argv[])
{ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> m;unit = int(sqrt(n)+0.5);rep(i,1,n+1){cin >> a[i];}int op,l,r,x;rep(i,1,m+1){cin >> op >> l >> r >> x;q[i].op = op;q[i].L = l;q[i].R = r;q[i].val = x;q[i].id = i;}solve(q,m);rep(i,1,m+1){if(ans[i]){cout << "hana"<<endl;}else{cout << "bi" << endl;}}return 0;
}
/*
node[i].L = 1 node[i].R = 1 node[i].id = 1 node[i].op = 2 node[i].val = 2
node[i].L = 1 node[i].R = 1 node[i].id = 3 node[i].op = 3 node[i].val = 1
node[i].L = 1 node[i].R = 2 node[i].id = 2 node[i].op = 1 node[i].val = 2
node[i].L = 2 node[i].R = 3 node[i].id = 5 node[i].op = 1 node[i].val = 4
node[i].L = 5 node[i].R = 5 node[i].id = 4 node[i].op = 3 node[i].val = 16
*/

P3674 小清新人渣的本愿 (bitset+莫队)相关推荐

  1. 洛谷 P3674 小清新人渣的本愿 bitset+莫队

    题目: https://www.luogu.org/problemnew/show/P3674 题目大意: 给你一个长度为 N N N的序列,每次询问[l,r]能不能取出两个数,和或差或积等于C&qu ...

  2. 洛谷 P3674 小清新人渣的本愿(莫队 +bitset)

    我们利用一个长度为 1e5 的 bitset,当数值 c 出现时,将 c 位置赋值为 1,对于题目要求的操作可以转变为 求 bitset 中存在两个位置相差为 x 的 1 这个比较难,如下图 bits ...

  3. 小清新人渣的本愿(莫队+bitset)

    小清新人渣的本愿 这两天写了些 b i t s e t bitset bitset的题,但都不想写题解...正巧这道题还结合了莫队,也是正在学习的,就记录一下吧. 题意: 给定一个 a a a数组,有 ...

  4. P3674 小清新人渣的本愿 (莫队 + bitset)

    题目链接: P3674 小清新人渣的本愿 大致题意 给定一个长度为 n n n的序列, 有 m m m次询问操作. 1 l r x 表示询问 [ l , r ] [l, r] [l,r]是否存在 a ...

  5. 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]

    传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...

  6. luogu P3674 小清新人渣的本愿

    https://www.luogu.com.cn/problem/P3674 首先肯定是莫队 然后考虑如何判断,发现差可以直接用bitset 加法就整个数反过来(相当于取补集),然后再bitset 乘 ...

  7. 【题解】Luogu P3674 小清新人渣的本愿

    原题传送门 这题还算简单(我记得我刚学oi时就来写这题,然后暴力都爆零了) 看见无修改,那么这题应该是莫队 维护两个bitset,第二个是第一个的反串,bitset内维护每个数字是否出现过 第一种操作 ...

  8. [洛谷P3674]小清新人渣的本愿

    题目传送门 这道题是一道莫队题.对于每一种问法,就是查询对应的数是否在当前的区间内. 设$b[i]$表示莫队当前区间中有没有$i$这个数. 对于第一问"是否可以选出两个数它们的差为x&quo ...

  9. 洛谷-小清新人渣的本愿-(莫队+bitset)

    小清新人渣的本愿 题意: 就是给你一个数组,然后有3种查询,分别是问你l到r区间内,是否有两个数的差等于x,只和等于x,乘积为x. 思考: 其实看到,感觉就挺复杂的,没办法去找这种关系对,除了乘积为x ...

最新文章

  1. UpSetR:多数据集绘图可视化处理利器
  2. R语言ggplot2可视化指定图像标题(title)、副标题(subtitle)的内容、字体大小、字体类型、色彩、对齐方式等实战
  3. 关于嵌套循环的循环初始化语句问题:
  4. 阿拉伯与罗马数字互转程序
  5. 03-命令图片.doc
  6. vue/cli 3.0 脚手架【进阶】 使用 amfe-flexible 和 postcss-px2rem进行移动端适
  7. 第二章 数据的表示和运算 2.1.5 汉明(海明)校验码 [计算机组成原理笔记]
  8. Pair智能标注神器,全面升级,更加智能
  9. (08)System Verilog 类继承
  10. 【CCCC】L2-011 玩转二叉树 (25分),二叉树建树与遍历(我讨厌树,@L2-006)
  11. windows下文件路径太深,删除解决方案
  12. 367个公益宣传PPT模板免费下载网站
  13. 静态网页连接mysql数据库_静态网页可以联接sql数据库吗?代码怎么写?
  14. 魔百和CM201-1 线机教程 救砖(大部分情况能用)
  15. 利用一种新的灵活记分卡方法改进肽抗癌活性的预测和表征
  16. python多线程抢红包代码_python实现的抢红包程序代码
  17. 安卓开发中的重力感应传感器
  18. java将小写数字变成大写输出
  19. 遇到问题 SCO UNIX 不能TELNET 本机
  20. superset登陆网面Internal Server Error

热门文章

  1. 太原科技大学计算机学长学姐,【毕业季·青春永不落幕】 学长学姐,这是你们忘记带走的回忆 ——请查收...
  2. java将固定日期后推几天的功能实现
  3. 如何实现微信扫二维码调用外部浏览器打开指定页面的功能
  4. Unity 2D图片外轮廓描边和内发光的Shader实现
  5. [附源码]JAVA+ssm计算机毕业设计菜鸟驿站快递分发系统(程序+Lw)
  6. js变量拼接单引号和双引号
  7. Azure-创建AKS集群
  8. 百度云服务器到底怎么样?「对比说明」
  9. 斐波那契数列指的是这样一个数列:1、1、2、3、5、8....输出前 N 个 斐波那契数,要求每行5个
  10. java modbus lrc,C#实现modbus基于ASCII的LRC校验