【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 ...
随机推荐
- c# 类如何生成dll文件及引用
1.打开“工具”菜单下的“外部工具”子菜单: 2.点击“添加按钮,增加一个菜单,菜单内容填写如下: 注意参数那里为:/k "C:\vs2010\VC\vcvarsall.bat" ...
- git学习(一)----基础知识
git是世界上最好用最先进的版本管理系统,那么什么是版本管理系统呢,百度上是这样说的: 举个例子,当你写毕业论文的时候,灵感爆发了修改或者删除了一些内容,但是你还想保留之前的版本,就需要另存为不同的w ...
- linux基础知识汇总
1.如何快速回到上次操作的目录? cd - 2.如何快速回到家目录? 直接cd或者cd ~ 3.怎么回到上一级目录? cd .. 4.什么是相对路径,什么是绝对路径? 相对路径就是相对于当前目录的位置 ...
- [codeforces722C]Destroying Array
[codeforces722C]Destroying Array 试题描述 You are given an array consisting of n non-negative integers a ...
- PMU 简介
目录 1:PMIC2:Battery管理3:功耗4:常见问题5:参考文献 PMIC[MT6322] Source code structure Build option Battery char ...
- P2820 局域网 洛谷
https://www.luogu.org/problem/show?pid=2820 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成 ...
- 在d盘中创建一个文件夹 在文件夹里创建三个txt文本
import java.io.File; import java.io.IOException; public class FileDemo { public static void main(Str ...
- 【c++】面向对象程序设计之继承中的类作用域
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...
- Struts2框架起源
曾经也用过S2SH框架做过几个项目,都不是工作中的,学习WEB开发的时候接触的第一套框架也是S2SH,可是工作之后一直没实用到S2SH 框架进行开发. 感觉曾经用这个框架的时候根本没有深入去了解这个框 ...
- Django:视图和URL配置
一.视图 1.在mysite文件夹下.创建views.py文件(文件名称没有特别的要求): from django.http import HttpResponse def hello(re ...