难得学习一下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. 1010. Radix (25)(出错较多待改进)

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  2. rsync 同步文件重复拷贝问题

    rsync 是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件.在这种场景下,rsync 远比 cp 命令更加合适,它只会同步需要更新的文件,默认情况下 ...

  3. [luoguP1364] 医院设置(树的重心)

    传送门 假设数据再大些,我这就是正解,然而题解里总是各种水过. 两边dfs,一遍求重心,一遍统计距离. ——代码 #include <cstdio> #include <cstrin ...

  4. poj 2081 简单递推

    #include<stdio.h> #include<string.h> #define N 510000 int dp[N]; int f[10000000]; int ma ...

  5. 楼房重建(bzoj 2957)

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  6. 2016 Multi-University Training Contest 4 solutions BY FZU

    1001 Another Meaning 对于这个问题,显然可以进行DP: 令dp[i]表示到i结尾的字符串可以表示的不同含义数,那么考虑两种转移: 末尾不替换含义:dp[i - 1] 末尾替换含义: ...

  7. Linux下出现launch failed.Binary not found的解决方案

    Linux下出现launch failed.Binary not found的解决方案: Project->Properties->C/C++Build->Settings-> ...

  8. SQL SERVER 2012 第四章 连接 JOIN の OUTER JOIN,完全连接FULL JOIN,交叉连接CROSS JOIN

    SELECT <SELECT LIST> FROM <the table you want to be the "LEFT" table> <LEFT ...

  9. [Android] 通过GridView仿微信动态添加本地图片

    原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...

  10. HDU 1028 整数拆分 HDU 2082 找单词 母函数

    生成函数(母函数) 母函数又称生成函数.定义是给出序列:a0,a1,a2,...ak,...an, 那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn  称为序 ...