【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
大致题意: 给你\(n\)个\(m\)位二进制数。每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案能够得到给你的这个二进制数。
找规律
不难想到去对每一位分别讨论。
则根据位运算法则可得:
- 当你把某一位的数\(and\ 0\),就相当于把这一位数赋值为\(0\)。
- 当你把某一位的数\(or\ 1\),就相当于把这一位数赋值为\(1\)。
- 当你把某一位的数\(and\ 1\)或者\(or\ 0\)时,这一位的值均不变。
则可以得出一个结论:
- 若给定数这一位为\(0\),则对于这一位的运算中最后一次\(and\ 0\)要出现在最后一次\(or\ 1\)之后(或者两者都未出现)。
- 若给定数这一位为\(1\),则对于这一位的运算中最后一次\(or\ 1\)要出现在最后一次\(and\ 0\)之后(注意\(or\ 1\)必须有,\(and\ 0\)可有可无)。
但这样依然不太好操作,所以我们要进行进一步转化。
转化
考虑把操作序列转化为一个二进制数,\(or\)为\(0\),\(and\)为\(1\),且较后操作处于较高位。
然后把题目中给出的\(n\)个长度为\(m\)的数变为\(m\)个长度为\(n\)的数,第\(i\)个数由初始的\(n\)个数的第\(i\)位组成,且编号较大的数处于较高位。
这样一来操作与数就可以一一对应了。
然后考虑如果对应位相等,表示该操作无影响。
而不相等那一位,若操作序列中的值为\(0\),数中的值为\(1\),即操作序列中这一位小于该数中的这一位,说明是赋值为\(1\),反之是赋值为\(0\)。
由于二进制下比大小看不相等的最高位,所以我们可以得出结论:
- 若操作序列所表示的二进制数小于该数,则最终结果中该数所对应位上为\(1\)(不能等于是因为一定要有\(or\ 1\)操作)。
- 若操作序列所表示的二进制数大于等于该数,则最终结果中该数所对应位上为\(0\)。
也就是说,一个符合条件的操作序列所表示的二进制数,要满足其小于所有应得位为\(1\)的数,大于等于所有应得位为\(0\)的数。
而这也就是要小于所有应得位为\(1\)的数的最小值,大于等于所有应得数为\(0\)的数的最大值。
则可以先将所有数排序,然后求出所有数取模后的值,然后对于询问从小到大找最大值,从大到小找最小值即可。
具体实现详见代码。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000
#define M 5000
#define X 1000000007
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,m,v[M+5],pw[M+5];
struct data
{
int p;string s;
I bool operator < (Con data& o) Con {return s<o.s;}
}s[M+5];
I int XSub(CI x,CI y) {return x<y?x-y+X:x-y;}
int main()
{
RI Qt,i,j,l,r;string st;for(scanf("%d%d%d",&n,&m,&Qt),i=1;i<=m;++i) s[i].p=i;//初始化
for(i=1;i<=n;++i) for(cin>>st,j=1;j<=m;++j) s[j].s=st[j-1]+s[j].s;//初始化出字符串
for(pw[0]=i=1;i<=n;++i) (pw[i]=pw[i-1]<<1)>=X&&(pw[i]-=X);v[m+1]=pw[n];//预处理2的幂
for(sort(s+1,s+m+1),i=1;i<=m;++i) {for(j=0;j^n;++j) s[i].s[j]^48&&Inc(v[i],pw[n-j-1]);}//排序,预处理出每个数的值
W(Qt--)
{
for(cin>>st,l=0,i=m;i;--i) if(st[s[i].p-1]^'1') {l=i;break;}//找最小值
for(r=m+1,i=1;i<=m;++i) if(st[s[i].p-1]^'0') {r=i;break;}//找最大值
printf("%d\n",l<=r?XSub(v[r],v[l]):0);//计算答案
}return 0;
}
【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)的更多相关文章
- [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)
P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...
- 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)
题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...
- 【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)
题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变 ...
- BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...
- [洛谷P4436] HNOI/AHOI2018 游戏
问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...
- 【洛谷P2114】起床困难综合征 位运算+贪心
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...
- 洛谷 P2114 [NOI2014]起床困难综合症 位运算
题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...
- NOI2014 洛谷P2114 起床困难综合征(位运算)
呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...
- 洛谷P4438 [HNOI/AHOI2018]道路(dp)
题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...
随机推荐
- 解决Navicat 连接服务器数据库报10060问题
1.登录mysql,授予远程登录权限(确保mysql表里的登录user对应的host为 % 即可:若不是 % ,使用mysql的update更新对应host) mysql> use mysql; ...
- bzoj2502: 清理雪道(有源汇有上下界最小流)
传送门 别说话,自己看,我不会->这里 我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量 据说还有种方法是连上$(t,s,in ...
- MCP|ZCM|Investigating Lactococcus lactis MG1363 response to phage p2 infection at the proteome level(研究乳酸乳球菌MG1363在噬菌体p2感染后的蛋白质组水平变化)
一.概述: 噬菌体是特异性感染并最终杀死其细菌宿主的病毒.他们在所有生态系统中发挥着关键的生态作用.尽管经过了几十年的研究,噬菌体与细菌宿主之间的相互作用仍然知之甚少.本研究使用无标记定量蛋白质组学来 ...
- jmeter - 录制app接口
准备: 1.手机 2.wifi 3.Jmeter 步骤: 1.Jmeter->文件->Template 2.手机设置代理 端口:8888:电脑的ip,如下图设置 3.点击启动 ...
- 毕马威&阿里:通向智能制造的转型之路
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 2019 年 4 月 17 日,毕马威与阿里研究院携手举办了智能经济主题报告发布会,从技术.制造.组织 ...
- AT2382 A or...or B Problem
传送门 还是看题解的啦 先考虑一个显而易见的结论:A和B二进制下最高的几位相同是没用的(设去掉的那些位之和为sum) 然后我们设\(d\)为二进制下从高位到低位第一位不相同的,\(k\)为B从高位到低 ...
- 剑指offer刷题记录
目录 二维数组中的查找 替换空格 从尾到头打印链表 反转链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波拉切数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整次方 链表中倒数第 ...
- CentOS7.3下Zabbix3.5之邮件报警配置
一.邮件客户端以及脚本相关配置 1.安装sendmail,一般操作系统默认安装了安装 yum install sendmail 启动 service sendmail start 设置开机启动 chk ...
- 剑指Offer——数组中出现次数超过一半的数字——一题多解
看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- Bonetrousle HackerRank 数学 + 思维题
https://www.hackerrank.com/contests/world-codesprint-6/challenges/bonetrousle 给定一个数n,和k个数,1--k这k个,要求 ...