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 ...
随机推荐
- SSH--完全分布式主机设置【克隆过安装过Hadoop的主机后】
====准备完全分布式主机的ssh==== 2018-12-21 14:27:47 1.删除所有主机上.ssh下所有文件 2.在s250主机上生成密钥对 $>ssh-keygen -t rsa ...
- 使用mysqlbinlog从二进制日志文件中查询mysql执行过的sql语句 (原)
前提MySQL开启了binlog日志操作1. 查看MySQL是否开启binlog(进mysql操作) mysql> show variables like 'log_bin%'; 2 ...
- idea如何整理代码格式
1.先CRTL + A来选中需要整理的代码块.当然CRTL + A代表选中一个文件的所有代码. 2.然后CRTL + ALT + L,对,就是要记住这个快捷键.
- Orangegreenworks封装rpgmakermv
You’ll get a zip file with a folder called “lib” and a file called greenworks.js. Put both of them o ...
- JQuery基本知识(3)
JQuery基本知识(3) 一.JQuery拥有可操作HTML元素和属性的强大方法. 1.JQuery DOM操作(DOM文档对象模型) 获取内容的方法: text():设置或返回所选元素的文本内容 ...
- 关于CTeX的几个大坑
https://blog.csdn.net/zjutczj/article/details/53463478 最近一直忙着写小论文,毕业设计中期答辩,没有更新博客,忙过这一阵我会把这段时间学习机器学习 ...
- 按渠道计算 PV 和 UV
按渠道计算 PV 和 UV: ------------------按指定channel_id按月求PV.UV------------ drop table if exists tmp_pvuv; cr ...
- Properties (25)
1.Properties 没有泛型.也是哈希表集合,无序集合.{a=1,b=2,c=3} 2. 读取文件中的数据,并保存到集合 (Properties方法:stringPropertyName ...
- VPS高性能虚拟机KVM详解
1. KVM 介绍 1.0 虚拟化简史 其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux ...
- SQL表分区之一
一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由 ...