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 先只考虑最 ...
随机推荐
- 第2次作业:STEAM案例分析
1.介绍产品的相关信息 1.1我选择的产品是STEAM 1.2选择STEAM的理由 STEAM是一个线上游戏购买平台,不同于亚马逊购买DVD光盘,它支持从游戏库购买数字发行版体验游戏.另外,它也不同于 ...
- Beta冲刺-用户测试报告
一.项目概述 1.1项目名称 高校学生征信系统 1.2项目简介 此项目基于SSH框架,力图为学生提供征信服务和信用相关的借款和申请活动.其中以信用统计和管理为主,信用使用为辅,构建出一个集信用收集和使 ...
- django搭建web (三) admin.py -- 待续
demo 关于模型myQuestion,myAnswer将在后述博客提及 # -*- coding: utf-8 -*- from __future__ import unicode_literals ...
- Python 图片转字符画
Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ...
- 201421123042 《Java程序设计》第12周
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- 201421123042 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集题目) 1.1 实验总结.并回答:列举至 ...
- 从一次输入框无法输入的bug,谈如何限制输入框输入类型
bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...
- 【编程开发】PHP---面向对象
面向对象编程 类:在现实世界中,任何事物都有种类的概念:车 类是由特征和行为构成的. 特征:都是不动的,从出厂的时候就已经内置好了(属性) 行为:一种动的状态.(方法(函数)) 行为依赖于这些特征,而 ...
- JAVA_SE基础——69.Date类
package cn.itcast.other; import java.text.ParseException; import java.text.SimpleDateFormat; import ...
- python的模块和包
==模块== python语言的组织结构层次: 包->模块->代码文件->类->函数->代码块 什么是模块呢 可以把模块理解为一个代码文件的封装,这是比类更高一级的封装层 ...