[HNOI 2018]寻宝游戏
Description
给出 \(n\) 个 \(m\) 位的二进制数,在每一个二进制数间插入一个 &
或 |
,第 \(0\) 个数为 \(0\) , \(0,1\) 间也要插入符号,共插入 \(n\) 个符号。
给出 \(q\) 组询问,每组询问也给出一个二进制数,询问有多少种方式使得从左至右运算后结果为该数。
\(1\leq n\leq 1000,1\leq m\leq 5000,1\leq q\leq 1000\)
Solution
人类智慧题。
我们可以把每一位单独拿出来处理,将每一位压成一个 \(n\) 位的二进制数,第 \(i\) 位为 \(a_i\) 。越靠右位数越高。
我们对于生成的符号序列,将 &
记为 \(1\) , 将 |
记为 \(0\) 。同样越靠右位数越高。记为 \(x\) 。
考验人类智慧的就是,有这样一个结论:若第 \(i\) 位运算结果为 \(1\) ,当且仅当 \(x<a_i\) 。这个可以感性理解一下,比较直观。
那么我们考虑将 \(a_i\) 从大到小排序,我们只需找到这样的唯一一个断点,满足断点以左的 \(a_i\) 对应的那一位均为 \(1\) ,断点以右的均为 \(0\) 。
假设断点右边一位为 \(loc\) ,那么答案就是 \(a_{loc-1}-a_{loc}\) 。如果没有断点,显然无解。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1000+5, M = 5000+5, yzh = 1000000007;
int n, m, q, mp[M], cg[M];
char ch[M];
struct tt {
int b[N], id;
bool operator < (const tt &c) const {
for (int i = n; i >= 1; i--)
if (b[i] != c.b[i]) return b[i] > c.b[i];
}
}a[M];
int get_ans(int o) {
int x = 0, y = 0;
for (int i = n; i >= 1; i--) x = (2ll*x%yzh+a[o-1].b[i])%yzh;
for (int i = n; i >= 1; i--) y = (2ll*y%yzh+a[o].b[i])%yzh;
return ((x-y+(o == 1))%yzh+yzh)%yzh;
}
void work() {
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++) {
scanf("%s", ch+1);
for (int j = 1; j <= m; j++) a[j].b[i] = ch[j]-'0';
a[0].b[i] = 1;
}
for (int i = 1; i <= m; i++) a[i].id = i;
sort(a+1, a+m+1);
for (int i = 1; i <= m; i++) mp[a[i].id] = i;
while (q--) {
scanf("%s", ch+1);
for (int i = 1; i <= m; i++) cg[mp[i]] = ch[i]-'0';
int flag = 0, t = 0;
for (int i = 1; i <= m; i++) {
if (cg[i] && t) {flag = 1; break; }
if (cg[i] == 0) t = 1;
}
if (flag) puts("0");
else {
int flag = 0;
for (int i = 1; i <= m; i++)
if (cg[i] == 0) {printf("%d\n", get_ans(i)); flag = 1; break; }
if (!flag) printf("%d\n", get_ans(m+1));
}
}
}
int main() {work(); return 0; }
[HNOI 2018]寻宝游戏的更多相关文章
- [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)
P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...
- 【HNOI 2018】游戏
Problem Description 一次小 \(G\) 和小 \(H\) 在玩寻宝游戏,有 \(n\) 个房间排成一列,编号为 \(1,2,-,n\),相邻房间之间都有 \(1\) 道门.其中一部 ...
- 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)
题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...
- BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...
- [HNOI/AHOI2018]寻宝游戏
题目大意: $n(n\le1000)$个$m(m\le5000)$位的二进制数,第$0$个数为$0$.用$\wedge$和$\vee$将这些数连接起来.$q(q\le1000)$次询问,每次给定一个$ ...
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- P3320 [SDOI2015]寻宝游戏 解题报告
P3320 [SDOI2015]寻宝游戏 题目描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有\(N\)个村庄和\(N-1\)条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以 ...
- [BZOJ3991][SDOI2015]寻宝游戏
[BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...
- 【BZOJ】【3991】【SDOI2015】寻宝游戏
dfs序 我哭啊……这题在考试的时候(我不是山东的,CH大法吼)没想出来……只写了50分的暴力QAQ 而且苦逼的写的比正解还长……我骗点分容易吗QAQ 骗分做法: 1.$n,m\leq 1000$: ...
随机推荐
- CentOS 7 安装并配置 MySQL 5.6
Linux使用MySQL Yum存储库上安装MySQL 5.6,适用于Oracle Linux,Red Hat Enterprise Linux和CentOS系统. 1.添加MySQL Yum存储库 ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】
算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...
- MYSQL社区版安装手册
https://www.jb51.net/article/140412.htm 在本教程中使用MySQL最新的MySQL服务8.0.11的社区绿色版本进行安装,绿色版为zip格式的包,安装分为以下四步 ...
- OpenStack kolla 多 region 部署配置
region one: cat /etc/kolla/globals.yml openstack_region_name: "RegionOne" multiple_regions ...
- FFmpeg软硬解和多线程解码
一. AVCodecContext解码上下文 1.avcodec_register_all() : 注册所有的解码器 2.AVCodec *avcodec_find_decoder(enum AVCo ...
- 使用Navicat 创建mysql存储过程,实现日期加流水号序列
目的:使用Navicat 创建mysql存储过程,实现格式为8位日期(年月日)+5位流水号序列. 步骤: 1.打开Navicat 登录数据库,点击导航栏上的函数,如下图: 2.点击新建函数,选择“过程 ...
- Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题
King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...
- shell 多线程
不熟悉 io 重定向的童鞋,先学习一下相关知识 http://www.linuxplus.org/kb/io-redirection.html 下面是简单代码 #!/bin/bash tmpfile= ...
- 【Hight Performance Javascript】——脚本加载和运行
脚本加载和运行 当浏览器遇到一个<script>标签时,无法预知javascript是否在<p>标签中添加内容.因此,浏览器停下来,运行javascript代码,然后继续解析. ...
- 浅谈Express的put与del
假设有一个景区价格列表页,显示当前的价目表. 价目表存放在express应用的数组中: var tours = [ {id:0,name:'Hood River',price:99.99}, {id: ...