bzoj 5285: [Hnoi2018]寻宝游戏
Description

Solution
把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵
把每一列压成一个二进制数,其中最高位是最下面的元素
然后就有了 \(m\) 个二进制数 \(b_i\),然后逐位考虑
我们把操作序列也变成一个二进制数 \(x\),\(1\) 为 \(\&\),\(0\) 为 \(|\)
那么第 \(i\) 位最后的结果为 \(1\) 当且仅当 \(x<b_i\) (注意最高位是最下面的元素)
然后就是确定 \(x\) 的取值范围了
如果我们把 \(b\) 数组从大到小排序,如果确定了 \(x\) ,那么就相当与把 \(b\) 从某个地方断开,前面的二进制位变成 \(1\),后面的变成 \(0\)
考虑每一个询问: \(r_i\)
首先满足条件的情况一定是:在 \(b\) 数组中,\(r\) 中所有的 \(1\) 位都在 \(0\) 位前面
找到断点 \(i\) 之后,答案就是 \(b[i-1]-b[i]\) 了
#include<bits/stdc++.h>
using namespace std;
const int N=5010,mod=1000000007;
int n,m,Q,p[N];char s[N];
struct data{
bool b[1010];int id;
inline bool operator <(const data &p)const{
for(int i=n;i>=1;i--)
if(b[i]!=p.b[i])return b[i]>p.b[i];
return id<p.id;
}
}a[N];
bool w[N];
inline int putans(int x){
int ret=0,t=0;
for(int i=n;i>=1;i--)
ret=(1ll*ret*2+a[x-1].b[i])%mod;
for(int i=n;i>=1;i--)
t=(1ll*t*2+a[x].b[i])%mod;
ret=(ret-t+mod)%mod;
return ret+(x==1);
}
int main(){
freopen("hunt.in","r",stdin);
freopen("hunt.out","w",stdout);
cin>>n>>m>>Q;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++)a[j].b[i]=s[j]-'0';
}
for(int i=1;i<=m;i++)a[i].id=i;
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)p[a[i].id]=i;
for(int i=1;i<=n;i++)a[0].b[i]=1;
while(Q--){
scanf("%s",s+1);
for(int i=1;i<=m;i++)w[p[i]]=s[i]-'0';
bool t=0,flag=0;
for(int i=1;i<=m;i++){
if(t && w[i]){flag=1;break;}
t=w[i]^1;
}
if(flag)puts("0");
else{
for(int i=1;i<=m+1;i++){
if(w[i]==0){
printf("%d\n",putans(i));
break;
}
}
}
}
return 0;
}
bzoj 5285: [Hnoi2018]寻宝游戏的更多相关文章
- 5285: [Hnoi2018]寻宝游戏
5285: [Hnoi2018]寻宝游戏 链接 分析: 从下面依次确定运算符号,然后在确定的过程中,需要确定的位数会逐渐减少.比如最后有一个1,如果在从下往上确定了一个or 1,那么再往前可以随便选了 ...
- 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)
[BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)
BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...
- 树形结构的维护:BZOJ 3991: [SDOI2015]寻宝游戏
Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...
- bzoj 3991: [SDOI2015]寻宝游戏
Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...
- BZOJ 3991: [SDOI2015]寻宝游戏 树链的并+set
Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...
- [BZOJ 3991][SDOI2015]寻宝游戏(dfs序)
题面 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路 ...
- bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...
随机推荐
- beta冲刺2-咸鱼
q前言:今天晚上大概把github的的相关东西弄上了.然后把之前做的一些修改什么的也上传上去了.目测之后的话就是在自己这边改完然后直接上github那边去复制粘贴替换掉了. 昨天的问题:github这 ...
- 学号:201621123032 《Java程序设计》第14周学习总结
1:本周学习总结 2:使用数据库技术改造你的系统 2.1:简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 建立一个图书馆的表 建立读者用户个人的借书信息表---但是目前没有办法做到 ...
- bzoj千题计划214:bzoj3589: 动态树
http://www.lydsy.com/JudgeOnline/problem.php?id=3589 树链剖分 用线段数维护扫描线的方式来写,标记只打不下传 #include<cstdio& ...
- JAVA_SE基础——24.面向对象的内存分析
黑马程序员入学blog ... 接着上一章的代码: //车类 class Car{ //事物的公共属性使用成员变量描述. String name; //名字的属性 String color; //颜色 ...
- machine learning 之 导论 一元线性回归
整理自Andrew Ng 的 machine learnig 课程 week1. 目录: 什么是机器学习 监督学习 非监督学习 一元线性回归 模型表示 损失函数 梯度下降算法 1.什么是机器学习 Ar ...
- GIT入门笔记(20)- git 开发提交代码过程梳理
git开发提交流程新项目开发,可以直接往master上提交老项目维护,可以在分支上修改提交,多次add和commit之后,也可以用pull合并主干和本地master,解决冲突后再push 1.检出代码 ...
- jQuery serialize()方法获取不到数据,alert结果为空
网上查找,问题可能是 id有重复 经排查,没有发现重复id 解决方案 form表单中每个input框都没有name属性,添加name属性即可 若name属性与jQuery的关键字有冲突,也可导致该问题 ...
- CWMP开源代码研究——stun的NAT穿透
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 参考: http://www.cnblogs.com/myblesh/p/6259765.htm ...
- Oracle12c:创建主分区、子分区,实现自动分区插入效果
单表自动单个分区字段使用方式,请参考:<Oracle12c:自动分区表> 两个分区字段时,必须一个主分区字段和一个子分区字段构成(以下代码测试是在oracle12.1版本): create ...
- 类相关的BIF
1.>>> issubclass(C,A)#判断c是A的子类,返回真假 2.>>> isinstance(b1,B) #判断c1是B类的实例化对象,返回真假 3.& ...