难得学习一下C++的库。。【至今连map,vector都没用过的我。。

首先#include<bitset>或<bits/stdc++.h>

定义函数:  {

    bitset <15> b;    15是bitset长度 之后我就写成n了,b是变量名

    或:  string s='01001';  bitset <n> b(s);   若s不是01串会报错。若strlen(s)>n, bitset会只取s的前n位 否则 bitset会在前面补0   【注:举例n=10,    cout<<b 后得到的将是0000001001

    或:  bitset <n> b(5);   这里的5 是个unsigned long long,   bitset会将其转化成二进制,  若n小于其二进制位数,, 会保留低位的n个。

}

当然 也可以转回来{

    转unsigned:   unsigned int x=b.to_ulong();  printf("%u",x);    就是把bitset转成十进制,to_ulong()是个unsigned int;  b的位数大于32没有关系 但是b转成十进制的值大于等于1LL<<32(即爆unsigned)时 会报错。注意 这里若cout<<b是  0000001001 则x=9 ,所以右边是低位

    转string:   S=b.to_string(); S的strlen将和b的位数相同。
}

  {

    还是上面那个例子      cout<<b是  0000001001   则,最右边的1是  bitset的第0位 也就是低位,

      b.flip(2)  就是把第2位取反   cout:    0000001101

      b.set(2)  就是把第2位 置为1    cout:    0000001101

      b.reset(0)  就是把第0位 置为0    cout:    0000001000

    如果 位置超过范围就会报错

  }

b[pos] 访问b中在pos处二进制位

而且位数相同的bitset之间可以用位运算 写法同整数位运算

只要记住 bitset 在cout的时候 右边的是下标小的,下标i就表示二进制中2^i,其余就和整数理解一样了。

后面的拖别人的博客了:

  常用的成员函数:
b.any() b中是否存在置为1的二进制位?
b.none() b中不存在置为1的二进制位吗?
b.count() b中置为1的二进制位的个数
b.size() b中二进制位数的个数
b.test(pos) b中在pos处的二进制位置为1么?
b.set() 把b中所有二进制位都置为1
b.set(pos) 把b中在pos处的二进制位置为1
b.reset( ) 把b中所有二进制位都置为0
b.reset( pos ) 把b中在pos处的二进制位置置为0
b.flip( ) 把b中所有二进制位逐位取反
b.flip( pos ) 把b中在pos处的二进制位取反
b.to_ulong( ) 把b中同样的二进制位返回一个unsigned
os << b 把b中的位集输出到os流

还有一个:  如 bitset <3> a;  若a={110}   则a<<1 ={100} 即全体左移 多出来的那些补零。

那么现在就可以做这道题了。

就是莫队 然后 两个bitset互相&一下 就可以直接求答案了。。学bitset只是为了比手动压位方便一些、

 #include <bits/stdc++.h>
using namespace std;
const int O=;
const int X=;
int f[],a[],n,m,x;
struct opt{ int o,l,r,x,i; }op[];
bitset <X+> b,c,d,e;
bool cmp(opt a,opt b){ if (a.l/O!=b.l/O) return a.l<b.l; else return a.r<b.r; }
bool cmi(opt a,opt b){ return a.i<b.i; }
int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i) scanf("%d",&a[i]);
for (int i=;i<=m;++i) scanf("%d%d%d%d",&op[i].o,&op[i].l,&op[i].r,&op[i].x),op[i].i=i;
sort(op+,op+m+,cmp); op[].l=-O;
for (int i=;i<=m;++i){
if (op[i].l/O==op[i-].l/O){
for (int j=op[i-].l;j<op[i].l;++j) {--f[a[j]]; if (!f[a[j]]) b.reset(a[j]),c.reset(X-a[j]);}
for (int j=op[i-].l-;j>=op[i].l;--j) {if (!f[a[j]]) b.set(a[j]),c.set(X-a[j]); ++f[a[j]];}
for (int j=op[i-].r+;j<=op[i].r;++j) {if (!f[a[j]]) b.set(a[j]),c.set(X-a[j]); ++f[a[j]];}
}else{
for (int j=op[i-].l;j<=op[i-].r;++j) {f[a[j]]=; b.reset(a[j]); c.reset(X-a[j]);}
for (int j=op[i].l;j<=op[i].r;++j) {if (!f[a[j]]) b.set(a[j]),c.set(X-a[j]); ++f[a[j]];}
}
x=op[i].x;
if (op[i].o==){
d=b>>x; d&=b;
op[i].x=d.any();
}else
if (op[i].o==){
e=c<<(x+>>)>>(X-x+(x+>>));
d=b<<(X-x/)>>(X-x/); d&=e; //<<X-r>>X-r+l
op[i].x=d.any();
}else{
x=;
for (int j=,s=floor(sqrt(op[i].x));j<=s;++j)
if (!(op[i].x%j)&&f[j]&&f[op[i].x/j]) {x=; break;}
op[i].x=x;
}
}
sort(op+,op+m+,cmi);
for (int i=;i<=m;++i) op[i].x?puts("yuno"):puts("yumi");
return ;
}

citing

【Bitset】 BZOJ4810的更多相关文章

  1. BZOJ3687 简单题 【bitset】

    BZOJ3687 简单题 Description 小呆开始研究集合论了,他提出了关于一个数集四个问题: 1.子集的异或和的算术和. 2.子集的异或和的异或和. 3.子集的算术和的算术和. 4.子集的算 ...

  2. 【状压dp】【bitset】bzoj1688 [Usaco2005 Open]Disease Manangement 疾病管理

    vs(i)表示患i这种疾病的牛的集合. f(S)表示S集合的病被多少头牛患了. 枚举不在S中的疾病i,把除了i和S之外的所有病的牛集合记作St. f(S|i)=max{f(S)+((St|vs(i)) ...

  3. 【Bitset】重识

    ---------------------------------------------------------------------------- 一题题目: 一题题解: 这个题目哪来入门再好不 ...

  4. 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

    题意: 给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r. 2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法 ...

  5. 【分块】【bitset】hdu6085 Rikka with Candies

    给你数组A和B,A B中的元素大小都不超过5w,且两两不同. q次询问,每次给你个k,问你有多少对(i,j),满足A(i)%B(j)==k. 如题目所言模拟bitset的过程,实质上是个分块,每块的大 ...

  6. 【拓扑排序】【bitset】Gym - 101128A - Promotions

    给你一张DAG,若选择u点,则必须先选择所有能到达其的点.问你在选择A个点的情况下,哪些点必选:选择B个点的情况下,哪些点必选:选择B个点的情况下,哪些点一定不选. 选择A个点的情况,必选的点是那些其 ...

  7. 【动态规划】【滚动数组】【bitset】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal

    有两辆车,容量都为K,有n(10w)个人被划分成m(2k)组,依次上车,每个人上车花一秒.每一组的人都要上同一辆车,一辆车的等待时间是其停留时间*其载的人数,问最小的两辆车的总等待时间. 是f(i,j ...

  8. 【计算几何】【bitset】Gym - 101412G - Let There Be Light

    三维空间中有一些(<=2000)气球,一些光源(<=15),给定一个目标点,问你在移除不超过K个气球的前提下,目标点所能接受到的最大光照. 枚举每个光源,预处理其若要照射到光源,需要移走哪 ...

  9. 【bitset】【推导】hdu5961 传递

    <法一>http://blog.csdn.net/u014325920/article/details/53046890 1.判断传递的条件为:若G中有 一条边从a到b且有一条边从b到c ...

随机推荐

  1. c# 类如何生成dll文件及引用

    1.打开“工具”菜单下的“外部工具”子菜单: 2.点击“添加按钮,增加一个菜单,菜单内容填写如下: 注意参数那里为:/k "C:\vs2010\VC\vcvarsall.bat" ...

  2. git学习(一)----基础知识

    git是世界上最好用最先进的版本管理系统,那么什么是版本管理系统呢,百度上是这样说的: 举个例子,当你写毕业论文的时候,灵感爆发了修改或者删除了一些内容,但是你还想保留之前的版本,就需要另存为不同的w ...

  3. linux基础知识汇总

    1.如何快速回到上次操作的目录? cd - 2.如何快速回到家目录? 直接cd或者cd ~ 3.怎么回到上一级目录? cd .. 4.什么是相对路径,什么是绝对路径? 相对路径就是相对于当前目录的位置 ...

  4. [codeforces722C]Destroying Array

    [codeforces722C]Destroying Array 试题描述 You are given an array consisting of n non-negative integers a ...

  5. PMU 简介

    目录 1:PMIC2:Battery管理3:功耗4:常见问题5:参考文献 PMIC[MT6322]    Source code structure Build option Battery char ...

  6. P2820 局域网 洛谷

    https://www.luogu.org/problem/show?pid=2820 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成 ...

  7. 在d盘中创建一个文件夹 在文件夹里创建三个txt文本

    import java.io.File; import java.io.IOException; public class FileDemo { public static void main(Str ...

  8. 【c++】面向对象程序设计之继承中的类作用域

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...

  9. Struts2框架起源

    曾经也用过S2SH框架做过几个项目,都不是工作中的,学习WEB开发的时候接触的第一套框架也是S2SH,可是工作之后一直没实用到S2SH 框架进行开发. 感觉曾经用这个框架的时候根本没有深入去了解这个框 ...

  10. Django:视图和URL配置

    一.视图      1.在mysite文件夹下.创建views.py文件(文件名称没有特别的要求): from django.http import HttpResponse def hello(re ...