【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)

题面

BZOJ

洛谷

题解

既然是二进制按位的运算,显然按位考虑。

发现这样一个关系,如果是\(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]寻宝游戏(神仙题)的更多相关文章

  1. bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...

  2. [bzoj5285] [HNOI2018]寻宝游戏

    Description 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生的你,对这个活动非常感兴趣. ...

  3. 5285: [Hnoi2018]寻宝游戏

    5285: [Hnoi2018]寻宝游戏 链接 分析: 从下面依次确定运算符号,然后在确定的过程中,需要确定的位数会逐渐减少.比如最后有一个1,如果在从下往上确定了一个or 1,那么再往前可以随便选了 ...

  4. BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)

    BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...

  5. 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)

    题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...

  6. 【比赛】HNOI2018 寻宝游戏

    考试的时候就拿了30points滚粗了 听说myy对这题的倒推做法很无奈,官方题解在此 正解思路真的很巧妙,也说的很清楚了 就是分别考虑每一位,会发现题解中的那个性质,然后把询问的二进制数按照排序后的 ...

  7. [HNOI2018]寻宝游戏(题解转载自别处)

    题解(自别处转载): Luogu CSDN 这题关键是将运算符也替换成0,1 然后在运算符与原串混杂里找规律. 而且替换的方式也有所要求,考场上两种替换方式都要尝试. #include <bit ...

  8. bzoj 5285: [Hnoi2018]寻宝游戏

    Description Solution 把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵 把每一列压成一个二进制数,其中最高位是最下面的元素 然后就有了 \(m\) 个二进制数 ...

  9. HNOI2018寻宝游戏

    https://www.luogu.org/problemnew/show/P4424 题解 我们首先按位考虑. 如果有一位最终的结果为1,那么我们可以把树的序列看成一个二进制数,先出现的在底位,后出 ...

随机推荐

  1. Atcoder E - Knapsack 2 (01背包进阶版 ex )

    E - Knapsack 2 Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement The ...

  2. 【kindle笔记】之 《浪潮之巅》- 2018-1-

    <浪潮之巅> 这本书推荐自最爱的政治课老师. 政治课老师张巍老师.我会一直记得你的. 以这样的身份来到这个学校,他人的质疑,自己的忐忑,老板的不公.犹犹豫豫谨小慎微地前进. 第一次听到这样 ...

  3. 简单封装mongodb

    首先安装mongodb  npm i mongodb --save 简单封装,在modules目录下新建db.js var MongoClient=require('mongodb').MongoCl ...

  4. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci总结

    Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...

  5. 3 Asking for more information

    1 Could you tell me more about your idea? 2 Could I hear more about your idea? 3 Could you expain yo ...

  6. 安装openssl

    此方法安装原因: 由于我用是非企业版 redhat 没有注册  有很多的yum 不能安装  openssl是在其中. 开始安装: 1.虚拟机挂载ios 镜像文件 2.进入终端 cd /media/RH ...

  7. js中表达式 >>> 0 浅析

    zepto源码的Array.prototype.reduce有一行 len = t.length >>> 0 当时就很疑惑,知道 >>是移位,那>>>又 ...

  8. Linux 系统命令行入门基础

    Linux 命令行组成结构 打包及压缩命令 tar 解压压缩包:

  9. C# 中那些常用的工具类(Utility Class)(三)

    今天来接着写这个系列的文章,这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候 ...

  10. nginx反向代理proxy_pass的问题

    起因:今天企业部署一个项目,用的nginx做的反向代理,配置如下: 测试结果令人失望,IP:端口 能访问项目,域名:端口 也能访问 ,但是 域名/接口名 访问失败 ################## ...