【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知识点及面试面试大集合
题目来源:武sir--一个很有意思的人,点击这儿跳转 一.基础篇 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解 ...
- openstack-KVM-vCPU
一.KVM基础功能 (1)支持 硬件支持 VT-x VT-d 系统支持 kernel > 3.5 (2)计算机系统的子系统 CPU 处理器 Memory 内存 Storage 存储 Networ ...
- 【kindle笔记】之 《活着》-2018-2-5
[kindle笔记]读书记录-总 2018-2-5 今天凌晨一口气看完了<活着>,没想到竟然是个赤裸裸的悲剧,心情不太好地睡去. 福贵,一个小人物,坎坷无比的一生. 当你以为真他妈惨,真是 ...
- .net 报错汇总——持续更新
1.未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPla PM> Install-Package Microsoft ...
- 非常详细的Docker学习教程
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- 通过arcmap发布缓存服务,无法选择自定义方案
出现该问题是因为缓存目录有该缓存信息,清楚掉之后就可以选择自定义方案了
- js-其他跨域技术(JSONP`Comet)
###1. JSONP JSONP由两部分组成:回调函数和数据 JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL eg: function ha ...
- js 判断字符串中是否包含某个字符串的方法实例
String对象的方法 方法一: indexOf() (推荐) var str = "123"; console.log(str.indexOf("3") ...
- 协程和异步io
一. 并发.并行.同步.异步.阻塞.非阻塞 1.并发:是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机上运 ...
- centos5 安装redmine
一.下载依赖包 yum -y install libxslt-devel libyaml-devel libxml2-devel gdbm-devel libffi-devel yum -y inst ...