[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> ...
随机推荐
- alpha冲刺第五天
一.合照 二.项目燃尽图 三.项目进展 调整了一些界面的布局 细化了部分小功能的界面 注册界面和服务器响应了,但是在insert数据库方面出现了错误 四.明日规划 继续研究如何将注册的内容插入数据库 ...
- Beta冲刺第四天
一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:修复协作详情,日程详情日程类型显示纠正 2.黄腾达:修复管理者查看协作成员可以移除自己的问题,加入登录.注册表单按回车键就可直接完成操作的功能 3 ...
- 团队作业7-Beta版本冲刺计划及安排
a.下一阶段需要改进完善的功能 对部分bug的修改,主要是在未登录时页面跳转的问题以及防止通过对数据库进行注入查询. b.下一阶段新增的功能 1.活动页面,提示打折信息等. 2.商家修改打折信息 3. ...
- 201621123060《JAVA程序设计》第一周学习总结
1.本周学习总结 1.讲述了JAVA的发展史,关于JDK.JRE.JVM的联系和区别 2.JDK是用JAVA开发工具.做项目的关键.JRE是JAVA的运行环境(JAVA也是JAVA语言开发的).JVM ...
- 【iOS】swift init构造器
这几天在使用 Swift 重写原来的一个运动社交应用 SportJoin. 为什么要重写呢? 首先因为实在找不到设计师给我作图; 其次, 我也闲不下来, 想找一些项目做, 所以只好将原来的代码重写了. ...
- RxSwift:ReactiveX for Swift 翻译
RxSwift:ReactiveX for Swift 翻译 字数1787 阅读269 评论3 喜欢3 图片发自简书App RxSwift | |-LICENSE.md |-README.md |-R ...
- 接触JS的变量
刚刚接触到js,写的代码都是很简单的,制单的概念也相当少,新学习的就是变量.let和const以及js的数据类型. 变量的内容有五个,我就不一一介绍了,重点在于: 在 JavaScript 中,使用变 ...
- slf4j 与 log4j2 实战讲解与日志分割
这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下. 1.为什我要用 因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用l ...
- JAVA_SE基础——63.String类的常用方法
获取方法int length() 获取字符串的长度char charAt(int index) 获取特定位置的字符 (角标越界)int indexOf(String str) 查找子串第一次出现的索 ...
- kali linux 2.0 web 渗透测试 电子书
原创 2017-05-31 玄魂工作室 玄魂工作室 打起精神,重新开启订阅号的原创文章写作工作,但是需要点时间,请耐心等待. 求资料的同学,没有及时回复的,请再次留言,我会尽快处理.今天分享两本电子书 ...