bzoj 4810 由乃的玉米田 - bitset - 莫队算法
Input
Output
Sample Input
5 5
1 1 2 3 4
2 1 1 2
1 1 2 2
3 1 1 1
3 5 5 16
1 2 3 4
Sample Output
yuno
yumi
yuno
yuno
yumi
题目大意 (数据结构裸题不需要大意)。(这是由乃OI?)
显然bitset(别问我怎么知道的)。
然而考虑分块,MLE?所以果断否决掉。
是有个基于分块有很省内存的算法?莫队啊,我们只需要2个bitset和一个cnt数组就好了。
现在来考虑具体的操作。
1)区间内是否存在两个数差为x。这个很简单,bitset一个基本的应用。bitset维护一个值域,然后将所有数都减去x(相当于将这个bitset右移x位),再看有没有数相等(新bitset按位与旧bitset得到的bitset是否存在某一位为1,调用它的函数any()就好了)
2)区间内是否存在两个数和为x。考虑a + b = x,加法不是很好处理,就转化成减法,得到a - (-b) = x。因为bitset不支持负数下标,把大小增大常数又变大,所以考虑用2个bitset。新的bitset维护某一个上限加上-b后的值域。查询的时候我们希望将第一个bitset右移x位,显然负数位才有价值,但是右移溢出的比特位会被直接舍去。所以考虑向左移,把右移x后,没有溢出的部分全部删去。这样的话就左移(limit - x)位,在和第二个bitset进行按位与,然后判断是否存在某一位为1。
3)还是bitset?想多了。。。Tag害死人啊。。值域只有1e5。是不是直接根号大暴力(枚举因子)就完事了?(然后我忘判因子了,就WA了几次)
Code
/**
* bzoj
* Problem#4810
* Accepted
* Time:13672ms
* Memory:4472k
*/
#include<bits/stdc++.h>
using namespace std;
typedef bool boolean; typedef class Query {
public:
int opt;
int l;
int r;
int x;
int lid;
int id; Query():opt(opt), l(l), r(r), x(x), lid(lid) { } boolean operator < (Query b) const {
if(lid != b.lid) return lid < b.lid;
return r < b.r;
}
}Query; #define limit 100001
int n, m, cs;
int *arr;
bitset<> s, s1, rs;
Query* qs;
inline void init() {
scanf("%d%d", &n, &m);
arr = new int[(n + )];
qs = new Query[(m + )];
cs = sqrt(n + 0.5);
for(int i = ; i <= n; i++)
scanf("%d", arr + i);
for(int i = ; i <= m; i++) {
scanf("%d%d%d%d", &qs[i].opt, &qs[i].l, &qs[i].r, &qs[i].x);
qs[i].lid = qs[i].l / cs, qs[i].id = i;
}
} boolean *res;
int cnt[];
inline void extends(int pos, int val) {
cnt[arr[pos]] += val;
if(cnt[arr[pos]] == ) s[arr[pos]] = , rs[limit - arr[pos]] = ;
if(cnt[arr[pos]] == ) s[arr[pos]] = , rs[limit - arr[pos]] = ;
} inline void solve() {
res = new boolean[(m + )];
sort(qs + , qs + m + );
int mdzzl = , mdzzr = ;
boolean aFlag = false;
for(int i = ; i <= m; i++) {
while(mdzzr < qs[i].r) extends(++mdzzr, );
while(mdzzr > qs[i].r) extends(mdzzr--, -);
while(mdzzl > qs[i].l) extends(--mdzzl, );
while(mdzzl < qs[i].l) extends(mdzzl++, -);
switch(qs[i].opt) {
case :
s1 = (s << qs[i].x) & s;
res[qs[i].id] = s1.any();
break;
case :
s1 = (s << (limit - qs[i].x)) & rs;
res[qs[i].id] = s1.any();
break;
case :
aFlag = false;
for(int j = ; j * j <= qs[i].x; j++)
if((qs[i].x % j == ) && s[j] && s[qs[i].x / j]) {
aFlag = true;
break;
}
res[qs[i].id] = aFlag;
break;
default:
break;
}
}
for(int i = ; i <= m; i++)
puts((res[i]) ? ("yuno") : ("yumi"));
} int main() {
init();
solve();
return ;
}
bzoj 4810 由乃的玉米田 - bitset - 莫队算法的更多相关文章
- BZOJ 4810 [Ynoi2017]由乃的玉米田 ——Bitset 莫队算法
加法和减法的操作都能想到Bitset. 然后发现乘法比较难办,反正复杂度已经是$O(n\log{n})$了 枚举因数也不能更差了,直接枚举就好了. #include <map> #incl ...
- 【BZOJ4810】[Ynoi2017]由乃的玉米田 bitset+莫队
[BZOJ4810][Ynoi2017]由乃的玉米田 Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.由乃认为玉米田不美,所 ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田 (莫队 + bitset)
题目链接 BZOJ 4810 首先对询问离线, 莫队算法处理. 首先我们可以用bitset维护处当前区间中是否存在某个数. 对于询问1, 我们可以用 ((f >> q[i].x) &am ...
- 【BZOJ4810】[YNOI2017] 由乃的玉米田(莫队+bitset)
点此看题面 大致题意: 给你一段序列,每次询问一段区间内是否存在两个数的差或和或积为\(x\). 莫队算法 看到区间询问+可以离线,首先想到了莫队啊. 但是,在较短的时间内更新信息依然比较难以实现. ...
- BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...
- BZOJ4810 Ynoi2017由乃的玉米田(莫队+bitset)
多组询问不强制在线,那么考虑莫队.bitset维护当前区间出现了哪些数,数组记录每个数的出现次数以维护bitset.对于乘法,显然应有一个根号范围内的因子,暴力枚举即可.对于减法,a[i]-a[j]= ...
- 【BZOJ】3781: 小B的询问(莫队算法)
http://www.lydsy.com/JudgeOnline/problem.php?id=3781 还能不能再裸点.. #include <cstdio> #include < ...
- 【BZOJ】2120: 数颜色 带修改的莫队算法
[题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...
- bzoj 2038 小Z的袜子(hose)(莫队算法)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 11542 Solved: 5166[Sub ...
随机推荐
- Flex中如何利用FocusManager类的setFocus函数设置TextInput的焦点的例子
参考:https://blog.csdn.net/liruizhuang/article/details/5876455 <?xml version="1.0" encodi ...
- RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例
前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密 私加 ===================== ...
- Vue+webpack项目中实现跨域的http请求
目前Vue项目中对json数据的请求一般使用两个插件vue-resource和axios, 但vue-resource已经不再维护, 而axios是官方推荐的且npm下载量已经170多万,github ...
- 第四章 HTML5概述
HTML5概述1.HTML5优势:解决跨浏览器问题:部分代替原来的js更明确地语义支持:不再单纯使用div增强WEB应用程序地功能:拖拽API等 2.HTML5语法改变标签不再区分大小写元素可以省略结 ...
- EF切EFCore2.0存储过程问题
在从EF切换成EFCore2.0的过程中,遇到了存储过程的实现问题. 在EF中调用存储过程,非常方便,能够直接将结果转换成对应的结果类. 如代码中的Database.SqlQuery<TElem ...
- 清华操作系统实验--80x86汇编基础
前言 80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 ...
- 五 js对象简介
对象简介 js中没有"类"的概念,只有对象. A:对象声明方式有三种 ------------1.调用Object函数创建对象: var person = new Object; ...
- python ---多线程thread
thread 在数据预处理的时候用处不大,因为有GIL 锁 查看thread信息 import threading print(threading.current_thread()) print(th ...
- 类模板中的static关键字
特性: 1.从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员 2. 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定 ...
- html5-垂直定位
*{ padding: 0px; margin: 0px; }#div2{ background: green; padding: 15px; width: 200px; ...