【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)
【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)
题面
题解
既然是二进制按位的运算,显然按位考虑。
发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无论前面是啥,操作完之后都是\(1\);同理\(and\ 0\)也是一样,无论前面是什么,操作完都是\(0\)。
换个角度来看,如果\(or\ 0\),无论前面是什么,操作完之后都不改变,\(and\ 1\)同理。
那么把\(or\)写成\(0\),\(and\)写成\(1\)。
那么,如果当前操作数前面的运算符和某一位上相同,那么就等价于没有进行操作,否则直接知道了运算结果。
假如只有一个二进制位的话,那么就是一个长度为\(n\)的\(01\)串\(x\),和一个长度为\(n\)的操作串\(opt\)。设最后一位为最高位。
如果最终的结果是\(1\),那么意味着\(x>opt\),否则最终结果为\(0\)。可以手玩验证。
大致的证明的话,如果最后结果是\(1\),意味着最后一个\(or\ 1\)的操作一定要在最后一个\(and\ 0\)的操作之后。再把\(or\)和\(and\)换成\(01\)表示就可以得到这个结论。
这样一来就变成了比大小的问题了。我们可以算出\(x\le opt<y\),那么答案就是\(y-x\)。
然后一个细节问题,首先提前把每一位按照\(x\)排好序,用基数排序即可。这样子可以直接\(for\)结果为\(0\)的最大值和结果为\(1\)最小值。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 5050
#define MOD 1000000007
char ch[MAX];
int g[1010][MAX],bin[1010],n,m,q;
int c[2],a[MAX],b[MAX],s[MAX],t[MAX];
int main()
{
scanf("%d%d%d",&n,&m,&q);
bin[0]=1;for(int i=1;i<=n;++i)bin[i]=2*bin[i-1]%MOD;
for(int i=1;i<=m;++i)a[i]=i;
for(int i=1;i<=n;++i)
{
scanf("%s",ch+1);c[0]=0;c[1]=m;
for(int j=1;j<=m;++j)(ch[j]-48)?s[j]=(s[j]+bin[i-1])%MOD:++c[0];
for(int j=m;j;--j)b[c[ch[a[j]]-48]--]=a[j];
for(int j=1;j<=m;++j)a[j]=b[j];
}
for(int i=1;i<=m;++i)t[i]=s[a[i]];t[m+1]=bin[n];
while(q--)
{
scanf("%s",ch+1);int mx=m+1,mn=0;
for(int i=m;i;--i)if(ch[a[i]]-48==0){mn=i;break;}
for(int i=1;i<=m;++i)if(ch[a[i]]-48){mx=i;break;}
printf("%d\n",mn>mx?0:(t[mx]-t[mn]+MOD)%MOD);
}
return 0;
}
【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)的更多相关文章
- bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...
- [bzoj5285] [HNOI2018]寻宝游戏
Description 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生的你,对这个活动非常感兴趣. ...
- 5285: [Hnoi2018]寻宝游戏
5285: [Hnoi2018]寻宝游戏 链接 分析: 从下面依次确定运算符号,然后在确定的过程中,需要确定的位数会逐渐减少.比如最后有一个1,如果在从下往上确定了一个or 1,那么再往前可以随便选了 ...
- BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)
BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...
- 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)
题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...
- 【比赛】HNOI2018 寻宝游戏
考试的时候就拿了30points滚粗了 听说myy对这题的倒推做法很无奈,官方题解在此 正解思路真的很巧妙,也说的很清楚了 就是分别考虑每一位,会发现题解中的那个性质,然后把询问的二进制数按照排序后的 ...
- [HNOI2018]寻宝游戏(题解转载自别处)
题解(自别处转载): Luogu CSDN 这题关键是将运算符也替换成0,1 然后在运算符与原串混杂里找规律. 而且替换的方式也有所要求,考场上两种替换方式都要尝试. #include <bit ...
- bzoj 5285: [Hnoi2018]寻宝游戏
Description Solution 把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵 把每一列压成一个二进制数,其中最高位是最下面的元素 然后就有了 \(m\) 个二进制数 ...
- HNOI2018寻宝游戏
https://www.luogu.org/problemnew/show/P4424 题解 我们首先按位考虑. 如果有一位最终的结果为1,那么我们可以把树的序列看成一个二进制数,先出现的在底位,后出 ...
随机推荐
- python中换行,'\r','\n'及'、'\r\n'
'\r'的本意是回到行首,'\n'的本意是换行. 所以回车相当于做的是'\r\n'或者'\n\r'.'\r'就是换行并回行首, '\n'就是换行并回行首,用'\r\n'表示换行并回行首. window ...
- 行政区划sql数据脚本
行政区划sql数据脚本 IF (EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TB_Province]') ...
- 开发工程中遇到的BUG
Xcode7自带Git创建的项目"Couldn’t communicate with a helper application" git xcode7 zhunjiee 2015年 ...
- Jenkins部署net core小记
作为一个不熟悉linux命令的neter,在centos下玩Jenkins真的是一种折磨啊,但是痛并快乐着,最后还是把demo部署成功!写这篇文章是为了记录一下这次部署的流程,和心得体会. 网上很多资 ...
- Django之时间的设置
Django之时间的设置 在Django的配置文件 settings.py 中,有两个配置参数是跟时间与时区有关的,分别是 TIME_ZONE 和 USE_TZ. 如果USE_TZ设置为True时,D ...
- JSLinux
JSLinuxhttps://bellard.org/jslinux/vm.html?url=https://bellard.org/jslinux/win2k.cfg&mem=192& ...
- 常见的 CSRF、XSS、sql注入、DDOS流量攻击
CSRF攻击 :跨站请求伪造攻击 ,CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性 攻击者一般会使用吸引人的图片去引导用户点击进 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- 局域网 FTP建立,搭建一个简易的局域网服务器
1.创建用户名以及密码: 右键我的电脑 -> 管理->本地用户和组->右键用户->新用户----设置用户名密码: 2.安装IIS 和FTP :控制面板->程序->打 ...
- html5 datalist 选中option选项后的触发事件
使用input + datalist 实现自动补全功能,其中datalist中的内容是根据input输入的内容动态变换的,代码如下 <!DOCTYPE HTML> <html> ...