难得学习一下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. CodeForces 606C--Sorting Railway Cars,思路题~~~

    C - Sorting Railway Cars   Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d &am ...

  2. 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 236A,虽然很水,但有一个很简单的函数用起来方便

    A. Boy or Girl time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. 动手实操(一):如何用七牛云 API 实现相片地图?

    实操玩家: 在苹果手机上,我们只要打开定位服务,拍照后便能在相簿中找到地图,地图上显示着在各地拍摄的相片.网站上这种显示方式也并不少见,例如 Flickr.即将关闭的 Panoramio 等. 作为地 ...

  4. POJ 1635 树的最小表示法

    题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序 ...

  5. hdu4405:Aeroplane chess

    题目大意:有编号为0-n的格子,从0开始,扔骰子扔到几就走几格.有m个瞬移点,每个点可以从格x直接飞到格y,若瞬移到另一个瞬移点可以继续瞬移.求到达格n的期望扔骰子次数. 题解:期望DP入门好题.网上 ...

  6. ubuntu,CentOS永久修改主机名

    1.查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“@”符号后: 其二,在终端窗口中输入命令:hostna ...

  7. 理解流方式上传和form表单上传

    流方式上传: $post_input = 'php://input'; $save_path = dirname( __FILE__ ); $postdata = file_get_contents( ...

  8. [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp

    品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...

  9. 将Sublime Text 2搭建成一个好用的IDE(转)

    原文地址 将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime T ...

  10. [Bzoj3209]花神的数论题(数位dp)

    3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 1182[Submit][Status][Disc ...