【Bitset】 BZOJ4810
难得学习一下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的更多相关文章
- BZOJ3687 简单题 【bitset】
BZOJ3687 简单题 Description 小呆开始研究集合论了,他提出了关于一个数集四个问题: 1.子集的异或和的算术和. 2.子集的异或和的异或和. 3.子集的算术和的算术和. 4.子集的算 ...
- 【状压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)) ...
- 【Bitset】重识
---------------------------------------------------------------------------- 一题题目: 一题题解: 这个题目哪来入门再好不 ...
- 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge
题意: 给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r. 2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法 ...
- 【分块】【bitset】hdu6085 Rikka with Candies
给你数组A和B,A B中的元素大小都不超过5w,且两两不同. q次询问,每次给你个k,问你有多少对(i,j),满足A(i)%B(j)==k. 如题目所言模拟bitset的过程,实质上是个分块,每块的大 ...
- 【拓扑排序】【bitset】Gym - 101128A - Promotions
给你一张DAG,若选择u点,则必须先选择所有能到达其的点.问你在选择A个点的情况下,哪些点必选:选择B个点的情况下,哪些点必选:选择B个点的情况下,哪些点一定不选. 选择A个点的情况,必选的点是那些其 ...
- 【动态规划】【滚动数组】【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 ...
- 【计算几何】【bitset】Gym - 101412G - Let There Be Light
三维空间中有一些(<=2000)气球,一些光源(<=15),给定一个目标点,问你在移除不超过K个气球的前提下,目标点所能接受到的最大光照. 枚举每个光源,预处理其若要照射到光源,需要移走哪 ...
- 【bitset】【推导】hdu5961 传递
<法一>http://blog.csdn.net/u014325920/article/details/53046890 1.判断传递的条件为:若G中有 一条边从a到b且有一条边从b到c ...
随机推荐
- CodeForces 606C--Sorting Railway Cars,思路题~~~
C - Sorting Railway Cars Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d &am ...
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 236A,虽然很水,但有一个很简单的函数用起来方便
A. Boy or Girl time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 动手实操(一):如何用七牛云 API 实现相片地图?
实操玩家: 在苹果手机上,我们只要打开定位服务,拍照后便能在相簿中找到地图,地图上显示着在各地拍摄的相片.网站上这种显示方式也并不少见,例如 Flickr.即将关闭的 Panoramio 等. 作为地 ...
- POJ 1635 树的最小表示法
题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序 ...
- hdu4405:Aeroplane chess
题目大意:有编号为0-n的格子,从0开始,扔骰子扔到几就走几格.有m个瞬移点,每个点可以从格x直接飞到格y,若瞬移到另一个瞬移点可以继续瞬移.求到达格n的期望扔骰子次数. 题解:期望DP入门好题.网上 ...
- ubuntu,CentOS永久修改主机名
1.查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“@”符号后: 其二,在终端窗口中输入命令:hostna ...
- 理解流方式上传和form表单上传
流方式上传: $post_input = 'php://input'; $save_path = dirname( __FILE__ ); $postdata = file_get_contents( ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- 将Sublime Text 2搭建成一个好用的IDE(转)
原文地址 将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime T ...
- [Bzoj3209]花神的数论题(数位dp)
3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 1182[Submit][Status][Disc ...