[Luogu 3674]小清新人渣的本愿
Description
给你一个序列 \(A\) ,长度为 \(n\) ,有 \(m\) 次操作,每次询问一个区间是否可以
- 选出两个数它们的差为 \(x\) ;
- 选出两个数它们的和为 \(x\) ;
- 选出两个数它们的乘积为 \(x\) 。
\(1\leq n,m,A_i\leq 100000\)
Solution
前两个操作 \(bitset\) 可以解决;后一个操作直接暴力枚举因数单个询问 \(O(\sqrt n)\) 。复杂度承受得起。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, lim, A[N], cnt[N], ans[N];
bitset<(N<<1)>a, b, c;
struct tt {
int opt, l, r, x, id;
bool operator < (const tt &b) const {
return l/lim == b.l/lim ? r < b.r : l < b.l;
}
}p[N];
void moveout(int x) {
++cnt[A[x]]; if (cnt[A[x]] == 1) a[A[x]] = b[N+A[x]] = c[N-A[x]] = 1;
}
void movein(int x) {
--cnt[A[x]]; if (cnt[A[x]] == 0) a[A[x]] = b[N+A[x]] = c[N-A[x]] = 0;
}
void work() {
scanf("%d%d", &n, &m), lim = sqrt(n);
for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
for (int i = 1; i <= m; i++)
scanf("%d%d%d%d", &p[i].opt, &p[i].l, &p[i].r, &p[i].x),
p[i].id = i;
sort(p+1, p+m+1);
int curl = 1, curr = 0;
for (int i = 1; i <= m; i++) {
int l = p[i].l, r = p[i].r, x = p[i].x;
while (curr < r) ++curr, moveout(curr);
while (curl > l) --curl, moveout(curl);
while (curr > r) movein(curr), --curr;
while (curl < l) movein(curl), ++curl;
if (p[i].opt == 1) if ((a&(a<<x)).any()) ans[p[i].id] = 1;
if (p[i].opt == 2) if ((b&(c<<x)).any()) ans[p[i].id] = 1;
if (p[i].opt == 3) {
int lim = sqrt(x);
for (int j = 1; j <= lim; j++)
if (x%j == 0 && cnt[j] && cnt[x/j]) {ans[p[i].id] = 1; break; }
}
}
for (int i = 1; i <= m; i++) puts(ans[i] ? "hana" : "bi");
}
int main() {work(); return 0; }
else
对于一个叫做 foo
的 bitset
:
foo.size()
返回大小(位数)foo.count()
返回1的个数foo.any()
返回是否有1foo.none()
返回是否没有1foo.set()
全都变成1foo.set(p)
将第p + 1位变成1foo.set(p, x)
将第p + 1位变成xfoo.reset()
全都变成0foo.reset(p)
将第p + 1位变成0foo.flip()
全都取反foo.flip(p)
将第p + 1位取反foo.to_ulong()
返回它转换为unsigned long的结果,如果超出范围则报错foo.to_ullong()
返回它转换为unsigned long long的结果,如果超出范围则报错foo.to_string()
返回它转换为string的结果
[Luogu 3674]小清新人渣的本愿的更多相关文章
- 【题解】Luogu P3674 小清新人渣的本愿
原题传送门 这题还算简单(我记得我刚学oi时就来写这题,然后暴力都爆零了) 看见无修改,那么这题应该是莫队 维护两个bitset,第二个是第一个的反串,bitset内维护每个数字是否出现过 第一种操作 ...
- luogu P3674 小清新人渣的本愿
传送门 毒瘤lxl 本质是莫队,关键是怎么处理询问 这里需要开两个bitset(记为\(b1,b2\)),分别存\(x\)和\(n-x\)是否出现 对于询问1,即\(x-y=z\),由于\(y=x-z ...
- luogu P3674 小清新人渣的本愿(莫队+bitset)
这题是莫队维护bitset. 然而我并不会bitset以前讲过认为不考就没学 我真的太菜了. 首先维护一个权值的bitset--s. 操作3比较简单,我们可以\(\sqrt{x}\)枚举约数然后判断就 ...
- 【洛谷3674】小清新人渣的本愿(莫队,bitset)
[洛谷3674]小清新人渣的本愿(莫队,bitset) 题面 洛谷,自己去看去,太长了 题解 很显然的莫队. 但是怎么查询那几个询问. 对于询问乘积,显然可以暴力枚举因数(反正加起来也是\(O(n\s ...
- P3674 小清新人渣的本愿
P3674 小清新人渣的本愿 一道妙不可言的题啊,,, 一看就知道是个莫队 考虑求答案 1号操作就是个大bitset,动态维护当前的bitset \(S\),把能取哪些值都搞出来,只要\(S\ and ...
- LuoguP3674 小清新人渣的本愿 && BZOJ4810: [Ynoi2017]由乃的玉米田
题目地址 小清新人渣的本愿 [Ynoi2017]由乃的玉米田 所以这两题也就输出不一样而已 题解 这种lxl的题还是没修改操作的题基本就是莫队 分开考虑每个询问 1.减法 \(a-b=x⇒a=b+x\ ...
- [Luogu3674]小清新人渣的本愿
luogu 题意 给你一个序列a,长度为n,有m次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...
- 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]
传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...
- luogu3674 小清新人渣的本愿 (bitset+莫队)
对于加减,用bitset维护当前每个数有没有 对于乘,暴力枚举约数 然后莫队 复杂度$O(m(\sqrt{n}+\frac{c}{64}))$ #include<bits/stdc++.h> ...
随机推荐
- Git详细教程(1)---个人Git的基本使用
分布式版本控制系统--git 一.什么是Git 1.Git是什么 Git是目前世界上最先进的分布式版本控制系统(没有之一). 实际上版本控制系统有如下几个: 1) CVS 2) SVN 3) Git ...
- Java基础学习笔记十五 集合、迭代器、泛型
Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都 ...
- TOJ 1214: 数据结构练习题――线性表操作
描述 请你定义一个线性表,可以对表进行"在某个位置之前插入一个元素"."删除某个位置的元素"."清除所有元素"."获取某个位置的元 ...
- C语言--第四周作业
一.题目7-1 计算分段函数[1] 1.代码 #include <stdio.h> int main () { float x,result; scanf("%f",& ...
- Python处理图片缩略图
CPU 密集型任务和 IO 密集型任务分别选择多进程multiprocessing.Pool.map 和多线程库multiprocessing.dummy.Pool.map import os imp ...
- python的Collections 模块
Collections 模块 知识点 Counter 类 defaultdict 类 namedtuple 类 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它 ...
- Vim 中文社区:期待你的加入
我们的愿景 Vim 中文社区一直比较零散,缺少凝聚力,现有的一些群经常也是水的可以的,讨论各种无关紧要的内容,于是导致很大一部分人,将这些群丢入了群助手,渐渐地他们也淡出了 vim 中文社区. 而我理 ...
- map的infowindow的show事件(ArcGIS API for JS)
- Struts2 配置文件小结
每次写的博文都被管理员都被移出首页,好气!还希望有哪位大神可以指点迷津-- struts2 配置文件的 result 节点 result 节点是 action 节点的子节点,他代表着 action 方 ...
- Windows用户模式下注入方式总结
注入技术在病毒木马.游戏.打补丁等编程中应用很广泛,学习该技术不仅能帮助理解Windows工作原理,还能对病毒木马技术手段有更加深刻的理解,下面我们了解下各种注入方式吧. 一.DLL注入 在注入技术中 ...