【洛谷 P3674】 小清新人渣的本愿(bitset,莫队)
题目链接
因为每个数都是\(10^5\)以内,考虑直接用\(bitset\)维护。
\(a-b=x\),其实就是看是否有\(p\)和\(p+x\)同时存在,直接\(bitset\)移位按位与一下就好了。
\(a+b=x\),这个直接搞不好搞,所以考虑转化。
\]
其中\(N\)为一个常数,令\(f(x)=N-x\),则有
\]
于是再开个\(bitset\)维护\(f(x)\),然后就很显然了。
\(a*b=x\),这个显然没法用\(bitset\)做,但是\(x\)的因数个数是\(\sqrt x\)级别的,所以直接暴力枚举因数就行了。
为了防止负数的出现,上文中的\(N\)取题中的值域上限\(10^5\)
最后套上莫队模板。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bitset>
#include <cmath>
#include <iostream>
using namespace std;
const int MAXN = 100010;
bitset <MAXN> p1, p2;
int n, m, a[MAXN];
inline int read(){
int s = 0;
char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
return s;
}
int Q, v[MAXN], ans[MAXN];
struct ask{
int type, l, r, c, id;
int operator < (const ask A) const{
return l / Q == A.l / Q ? r < A.r : l < A.l;
}
}q[MAXN];
void add(int x){
++v[a[x]];
p1[a[x]] = p2[100000 - a[x]] = 1;
}
void del(int x){
if(!--v[a[x]])
p1[a[x]] = p2[100000 - a[x]] = 0;
}
int main(){
n = read(); m = read(); Q = sqrt(n);
for(int i = 1; i <= n; ++i)
a[i] = read();
for(int i = 1; i <= m; ++i)
scanf("%d%d%d%d", &q[i].type, &q[i].l, &q[i].r, &q[i].c), q[i].id = i;
sort(q + 1, q + m + 1);
int l = 1, r = 0;
for(int i = 1; i <= m; ++i){
while(r < q[i].r) add(++r);
while(l > q[i].l) add(--l);
while(r > q[i].r) del(r--);
while(l < q[i].l) del(l++);
if(q[i].type == 1){
ans[q[i].id] = (p1 & (p1 >> q[i].c)).any();
}else if(q[i].type == 2){
ans[q[i].id] = (p1 & (p2 >> (100000 - q[i].c))).any();
}else{
if(!q[i].c) ans[q[i].id] = v[0];
int sqr = sqrt(q[i].c);
for(int j = 1; j <= sqr; ++j)
if(q[i].c % j == 0)
if(v[j] && v[q[i].c / j]){
ans[q[i].id] = 1;
break;
}
}
}
for(int i = 1; i <= m; ++i)
printf("%s\n", ans[i] ? "hana" : "bi");
return 0;
}
【洛谷 P3674】 小清新人渣的本愿(bitset,莫队)的更多相关文章
- 洛谷P3674 小清新人渣的本愿(莫队)
传送门 由乃tql…… 然后抄了一波zcy大佬的题解 我们考虑把询问给离线,用莫队做 然后用bitset维护,每一位代表每一个数字是否存在,记为$now1$ 然后再记录一个$now1$的反串$now2 ...
- 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]
传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...
- 洛谷P3674 小清新人渣的本愿
题意:多次询问,区间内是否存在两个数,使得它们的和为x,差为x,积为x. n,m,V <= 100000 解: 毒瘤bitset...... 假如我们有询问区间的一个桶,那么我们就可以做到O(n ...
- 洛谷 P3674 小清新人渣的本愿
想看题目的戳我. 我刚开始觉得这道题目好难. 直到我从Awson大佬那儿了解到有一个叫做bitset的STL,这道题目就很容易被解开了. 想知道这个神奇的bitset的戳我. 这个题目一看就感觉是莫队 ...
- luogu P3674 小清新人渣的本愿(莫队+bitset)
这题是莫队维护bitset. 然而我并不会bitset以前讲过认为不考就没学 我真的太菜了. 首先维护一个权值的bitset--s. 操作3比较简单,我们可以\(\sqrt{x}\)枚举约数然后判断就 ...
- luogu3674 小清新人渣的本愿 (bitset+莫队)
对于加减,用bitset维护当前每个数有没有 对于乘,暴力枚举约数 然后莫队 复杂度$O(m(\sqrt{n}+\frac{c}{64}))$ #include<bits/stdc++.h> ...
- 【洛谷3674】小清新人渣的本愿(莫队,bitset)
[洛谷3674]小清新人渣的本愿(莫队,bitset) 题面 洛谷,自己去看去,太长了 题解 很显然的莫队. 但是怎么查询那几个询问. 对于询问乘积,显然可以暴力枚举因数(反正加起来也是\(O(n\s ...
- P3674 小清新人渣的本愿
P3674 小清新人渣的本愿 一道妙不可言的题啊,,, 一看就知道是个莫队 考虑求答案 1号操作就是个大bitset,动态维护当前的bitset \(S\),把能取哪些值都搞出来,只要\(S\ and ...
- 【题解】Luogu P3674 小清新人渣的本愿
原题传送门 这题还算简单(我记得我刚学oi时就来写这题,然后暴力都爆零了) 看见无修改,那么这题应该是莫队 维护两个bitset,第二个是第一个的反串,bitset内维护每个数字是否出现过 第一种操作 ...
- luogu P3674 小清新人渣的本愿
传送门 毒瘤lxl 本质是莫队,关键是怎么处理询问 这里需要开两个bitset(记为\(b1,b2\)),分别存\(x\)和\(n-x\)是否出现 对于询问1,即\(x-y=z\),由于\(y=x-z ...
随机推荐
- sprintf格式化字符串漏洞(转)
深入解析sprintf格式化字符串漏洞 特征: 如何利用: 可以看到, php源码中只对15种类型做了匹配, 其他字符类型都直接break了,php未做任何处理,直接跳过,所以导致了这个问题: 没做字 ...
- SpringBoot框架 之 Druid与Swagger2
目录 Druid Druid连接池配置 Druid数据监控 集成Swagger2 Swagger2简介 1.添加依赖 2.创建Swagger2配置类 3.在控制器方法上添加对应api信息 4.启动Sp ...
- 剑指offer:数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- Spring 事务模板方法设计模式
接上一篇文章 上一篇讲到了doGetTransaction方法 一.模板方法设计模式 这里涉及到了一个经典的设计模式:模板方法 如下图: AbstractPlatformTransactionMana ...
- redis 服务器开放给其他电脑连接
1.云服务器的端口6379开通 2.宝塔服务器上的6379开通 3.修改服务器上的redis配置文件: # bind 127.0.0.1 注释掉daemonize no 改为noprotected-m ...
- js控制input框只能输入数字和一位小数点和小数点后面两位小数
<script language="JavaScript" type="text/javascript"> function clearNoNum( ...
- php 类的属性--???
<?php class Car { private function __construct() { echo 'object create'; } private static $_objec ...
- PS弧形边缘的去黑色背景色
按照理论来说,纯色的字体加上纯色的背景,然后保存成png文件,然后用色彩范围选择纯色的背景,去掉背景,这样应该能得到原来设置的纯色的字体,但实际测试后不是这样的.如果是矩形等,是纯色,但是Photos ...
- linux修改系统时间和时区
1.修改系统时间linux系统时钟有两个,一个是硬件时钟,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时钟,是linux系统Kernel时间.当Linux启动时,系统Kernel ...
- node端代理浏览器路由 解决浏览器跨域问题
var _ = require('lodash'); var request = require("request"); /* @LM 2017-02-16 node端代理浏览器路 ...