BZOJ 4810 莫队+bitset

思路:

看完这道题根本没有思路啊....

然后我就膜拜了一波题解...

这神tm乱搞思路

维护两个bitset

第一个bitset代表当前区间哪些数出现过

第二个bitset是 maxp-p出现过

差为x的时候  就用第一个bitset与一下它右移x就好了

和为x的时候 就第一个bitset与一下第二个bitset右移maxp-x

乘积为x的时候 就枚举约数,, 暴力判断一下

复杂度是O(nsqrt(n)+n^2/32)的

//By SiriusRen
#include <cmath>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100050,M=100000;
int n,m,a[N],Block,block[N],cnt[N],ans[N];
bitset<N>f,g;
struct Node{int op,l,r,x,id;}node[N];
bool cmp(Node a,Node b){
    if(block[a.l]==block[b.l])return a.r<b.r;
    return a.l<b.l;
}
int main(){
    scanf("%d%d",&n,&m),Block=sqrt(n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),block[i]=(i-1)/Block+1;
    for(int i=1;i<=m;i++)scanf("%d%d%d%d",&node[i].op,&node[i].l,&node[i].r,&node[i].x),node[i].id=i;
    sort(node+1,node+1+m,cmp);
    for(int i=1,l=1,r=0;i<=m;i++){
        for(;r<node[i].r;r++)cnt[a[r+1]]++,f.set(a[r+1]),g.set(M-a[r+1]);
        for(;l>node[i].l;l--)cnt[a[l-1]]++,f.set(a[l-1]),g.set(M-a[l-1]);
        for(;l<node[i].l;l++){cnt[a[l]]--;if(!cnt[a[l]])f.reset(a[l]),g.reset(M-a[l]);}
        for(;r>node[i].r;r--){cnt[a[r]]--;if(!cnt[a[r]])f.reset(a[r]),g.reset(M-a[r]);}
        if(node[i].op==1){if((f&(f>>node[i].x)).any())ans[node[i].id]=1;}
        else if(node[i].op==2){if((f&(g>>(M-node[i].x))).any())ans[node[i].id]=1;}
        else{for(int j=1;j*j<=node[i].x;j++)if(node[i].x%j==0)
                if(f[j]&&f[node[i].x/j]){ans[node[i].id]=1;break;}
        }
    }for(int i=1;i<=m;i++)puts(ans[i]?"yuno":"yumi");
}
时间: 2024-08-05 13:13:23

BZOJ 4810 莫队+bitset的相关文章

bzoj 4810: [Ynoi2017]由乃的玉米田 莫队 bitset

bitset大概就是让你轻松建立一个很长的二进制数来存东西,并提供了快捷的操作和优美的常数. #include <bitset> bitset <32> b;32为长度 需要引用头文件,定义一个bitset. stl的东西,所以从0开始. 支持左右移. 支持下标访问修改. b.any() b中是否存在置为1的二进制位 b.none() b中不存在置为1的二进制位 b.count() b中置为1的二进制位的个数 b.size() b中二进制位的个数 b[pos] 访问b中在pos处的

BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, 还剩下几个数字,注意删去的是共有的数字个数,不是数字种类,统计时候也一样 [题解] 首先,答案为区间长度和减去区间并数字个数和的三倍. 所以题目转化为求区间并.很显然在开始对数据可以进行离散化. 考虑每个数字只出现一次的情况,我们可以用bitset来统计区间某个数字是否存在, 莫队处理查询每个区间,

洛谷 P3674 小清新人渣的本愿 [莫队 bitset]

传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别为操作1,2,3 题面太强啦!!! 感觉就是莫队,想了一下分块不好搞更坚定了莫队的信念 $a-b=x$,$a=x+b$,放在权值数组上就是b右移x位,$bitset$大法好 加法同理 乘法,总共就$\sqrt{N}$个约数.... #include <iostream> #incl

Gym - 100962F: Frank Sinatra (树上莫队+bitset)

题意:给定一棵树,带边权.然后Q次询问,每次给出(u,v),求这个路径上最小的未出现的边权. 思路:树上莫队,求mex可以用分块或者bitset,前者可能会快一点.   莫队过程:求出欧拉序,即记录dfs的in和out时间戳. 然后摊平成数组,在数组上进行莫队. 一般的莫队需要单独考虑LCA,因为LCA不在这个区间里. 但是由于这里是边权,用儿子代替边权,所以LCA本来就不用考虑. 这个序列里,有效的部分是出现奇数次的,所以用vis记录奇偶性,如果是奇,表示加: 偶表示删. 如果想再快一点,可以

bzoj 2038 莫队入门

http://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意:多次询问区间内取出两个相同颜色的种类数 思路:由于不是在线更新,那么可以进行离线查询,而且当知道了[l,r]的答案,且能在O(1)的条件下得知[l-1,r],[l+1,r],[l,r+1],[l,r-1]的答案,那么就能使用莫队算法了. 大致上,将区间分块,由于n=a+b>=a*b,显然将区间开平方根是最优的,我们先将询问保存,按照块序第一优先,再考虑右端点进行排序.再来,使用cnt[

bzoj 3289 莫队 逆序对

莫队维护逆序对,区间左右增减要分类讨论. 记得离散化. 1 /************************************************************** 2 Problem: 3289 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:5480 ms 7 Memory:3164 kb 8 ********************************************************

bzoj 3809 莫队

收获: 1.分块时顺便记录每个位置所属的块,然后一次排序就OK了. 2.要权衡在“区间移动”与“查询结果”之间的时间,莫队算法一般区间移动频率远大于查询结果,所以我们选择的辅助数据结构时就要注意了,我最开始写的是值域线段树,自己生成的极限数据要1m8s,改成树状数组后要24s,还是过不了,hzwer只要13s,细看hzwer的代码,发现Ta用的是分块,O(1)修改O(n0.5)查询,改成分块后的确快多了. 3.块的大小理论最优值是O(n*m-0.5),最开始设成这个交上去35卡过,改成hzwer

BZOJ 3339 &amp; 莫队+&quot;所谓的暴力&quot;

题意: 给一段数字序列,求一段区间内未出现的最小自然数. SOL: 框架显然用莫队.因为它兹瓷离线. 然而在统计上我打了线段树...用&维护的结点...400w的线段树...然后二分查找...炸的妥妥的... 然后发现所谓的"暴力"...直接开数组维护...因为指针具有一定的单调性,一次更改可以直接得到解,不用每次都查询... woc真是...有时候数据结构用多了忽略了那些更简单更实用的方法... Code TLE的代码: /*=========================

BZOJ 3339 &amp;&amp; BZOJ 3585 莫队+权值分块

显然若一个数大于n就不可能是答案. 1 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <algorithm> 6 #include <map> 7 #include <cmath> 8 using namespace std; 9 const int Maxn=200010; 10 struct Info{int l,r,Id;}P[