题目传送门

这道题是一道莫队题。对于每一种问法,就是查询对应的数是否在当前的区间内。

设$b[i]$表示莫队当前区间中有没有$i$这个数。

对于第一问“是否可以选出两个数它们的差为x”,也就是判断当$i-j=x$时是否存在$b[i],b[j]=1$。变形一下发现$i=j+x$,就成了$b[j],b[j+x]=1$。

我们用一个$\text{bitset}$操作,判断这一问就变成了判断$(b\ \text{&&}\ (b<<x))$是否为真。

对于第二问就是当$i+j=x$时,是否存在$b[i],b[j]=1$。变形下发现

$$i=x-j$$

$$i+N=x+N-j$$

$$i-(x-N)=(N-j)$$

再开个$b'=\text{bitset}$维护$N-j$,当$j$出现后,$N-j$为$1$。答案即为$((b<<(N-x))\ \text{&&}\ b')$。

对于第三问发现枚举因数直接判断复杂度不大,暴力解决。

一开始计算复杂度发现是$O(m\sqrt{n}+mn)$,$mn$复杂度是由$\text{bitset}$的与运算贡献的,会炸的。

但后来了解到$\text{bitset}$的复杂度要除掉一个$\omega$,$\omega$为计算机位数,一般为$32/64$。

所以就能卡过了。

下面的代码的写法可能与上面有细微差别,但与上面是等效的。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define re register
 6 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
 7 #define repd(i, a, b) for (re int i = a; i >= b; --i)
 8 #define maxx(a, b) a = max(a, b);
 9 #define minn(a, b) a = min(a, b);
10 #define LL long long
11 #define INF (1 << 30)
12
13 inline int read() {
14     int w = 0, f = 1; char c = getchar();
15     while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
16     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar();
17     return w * f;
18 }
19
20 const int maxn = 1e5 + 5;
21
22 bitset<maxn> S1, S2;
23
24 struct Query {
25     int l, r, id, pos, opt, x;
26 } q[maxn];
27 bool cmp(Query a, Query b) { return a.pos < b.pos || a.pos == b.pos && a.r < b.r; }
28
29 int n, m, a[maxn], ans, b[maxn], size, cnt[maxn];
30
31 void del(int x) { cnt[x]--; if (!cnt[x]) S1[x] = S2[n-x] = 0; }
32 void ins(int x) { if (!cnt[x]) S1[x] = S2[n-x] = 1; cnt[x]++; }
33
34 int main() {
35     n = read(), m = read();
36     size = sqrt(n);
37     rep(i, 1, n) a[i] = read();
38     rep(i, 1, m) q[i].opt = read(), q[i].l = read(), q[i].r = read(), q[i].x = read(), q[i].id = i, q[i].pos = (q[i].l + size - 1) / size;
39     sort(q+1, q+m+1, cmp);
40     int pl = 1, pr = 0;
41     rep(i, 1, m) {
42         while (pl < q[i].l) del(a[pl]), pl++;
43         while (pl > q[i].l) pl--, ins(a[pl]);
44         while (pr < q[i].r) pr++, ins(a[pr]);
45         while (pr > q[i].r) del(a[pr]), pr--;
46         if (q[i].opt == 1) {
47             b[q[i].id] = ((S1 << q[i].x) & S1).any() ? 1 : 0;
48         }
49         else if (q[i].opt == 2) {
50             b[q[i].id] = ((S2 >> (n-q[i].x)) & S1).any() ? 1 : 0;
51         }
52         else if (q[i].opt == 3) {
53             b[q[i].id] = 0;
54             rep(x, 1, sqrt(q[i].x))
55                 if (!(q[i].x % x) && S1[x] && S1[q[i].x/x]) { b[q[i].id] = 1; break; }
56         }
57     }
58     rep(i, 1, m) printf("%s\n", b[i] ? "hana" : "bi");
59     return 0;
60 }

转载于:https://www.cnblogs.com/ac-evil/p/10372191.html

[洛谷P3674]小清新人渣的本愿相关推荐

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

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

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

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

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

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

  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,有m次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别 ...

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

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

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

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

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

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

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

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

最新文章

  1. PEAK6 2020校招OA
  2. C# 集合类(三):Stack
  3. 【Source Insight 4.0 英文版】 如何设置选中高亮
  4. 腾讯数据库RTOlt;30s,RPO=0高可用方案首次全景揭秘
  5. 7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理
  6. 从零开始拿到了Kaggle竞赛冠军
  7. 面向对象的程序开发技术C++教学课件系列之二
  8. springMVC接受括号乱码
  9. linux刷新本地dns命令_如何在Linux上刷新DNS缓存
  10. npm安装报错: errno ETIMEDOUT network request toXXX failed, reason: connect ETIMEDOUT
  11. C++ 设计模式 面向对象设计原则 相关概念介绍(结合UnrealEngine4)
  12. 小测试整理(含T1 T2)
  13. PHP7 安装 Swoole 教程
  14. OkHttpClient简单封装
  15. 如虎添翼:施加负压的电磁车模
  16. linux平台编译运行c++程序
  17. 网站图标(?不知道叫啥,反正是IE里网址左边的小图)和书签图标
  18. wireshark抓包,分析出PNG后解析
  19. linux系统实现路由功能
  20. 计算机教师继续教育心得,2014教师继续教育心得体会

热门文章

  1. 程序员如何把自己逼死?
  2. dubbo系列二:Dubbo的基本应⽤与⾼级应⽤
  3. 用户收视率指标_时代的标志:电视现在具有网络收视率
  4. 捋一捋Python中的Dict(上)
  5. java i18n_Java国际化(i18n)
  6. Vue-i18n与Vuex-i18n等vue的国际化方案
  7. BeanFactory和FactoryBean的区别
  8. DO447使用过滤器和插件转换器--使用查找模板化外部数据
  9. uniapp——基于picker实现年月日时分秒选择器
  10. 10php1c,良心点评解析追觅v10和小米1c哪个好?有什么区别实情爆料细节