[HNOI/AHOI2018]寻宝游戏
题目大意:
$n(n\le1000)$个$m(m\le5000)$位的二进制数,第$0$个数为$0$。用$\wedge$和$\vee$将这些数连接起来。$q(q\le1000)$次询问,每次给定一个$m$位二进制数$r$,问有多少种连接方案使得结果为$r$。
思路:
参考myy的官方题解:
如果第$i$个数之前的运算符是$\wedge$,则这一位设为$1$,否则为$0$,得到的二进制数记为$x$。
对每一位分别考虑,对于第$i$位,如果第$j$个数是$1$,那么这一位设为$1$,否则为$0$,得到的二进制数记为$b_i$。
以左边为最低位,按前缀归纳容易证明,第$i$位的结果为$1$,当且仅当$x<b_i$。
我们将$b$从大到小排序,结果设为$c$,那么答案不为零仅当在$c$的顺序下,$r$中没有任何$0$在$1$的前面。找到$r$中第一个$0$的位置,假设是$k$,那么解$x$要满足$c_k\le x<c_{k-1}$,于是答案是$c_{k-1}-c_k$。
#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
#include<sys/mman.h>
#include<sys/stat.h>
typedef long long int64;
class MMapInput {
private:
char *buf,*p;
int size;
public:
MMapInput() {
register int fd=fileno(stdin);
struct stat sb;
fstat(fd,&sb);
size=sb.st_size;
buf=reinterpret_cast<char*>(mmap(,size,PROT_READ,MAP_PRIVATE,fileno(stdin),));
p=buf;
}
char getchar() {
return (p==buf+size||*p==EOF)?EOF:*p++;
}
};
MMapInput mmi;
inline int getint() {
register char ch;
while(!isdigit(ch=mmi.getchar()));
register int x=ch^'';
while(isdigit(ch=mmi.getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline int getdigit() {
register char ch;
while(!isdigit(ch=mmi.getchar()));
return ch^'';
}
const int N=,M=,mod=1e9+;
int pow[M],rank[M],tmp[M],a[M],sum[M];
int main() {
const int n=getint(),m=getint(),q=getint();
for(register int i=;i<m;i++) rank[i]=i;
for(register int i=pow[]=;i<=n;i++) {
pow[i]=pow[i-]*%mod;
}
for(register int i=;i<n;i++) {
int cnt[]={-,m-};
for(register int j=;j<m;j++) {
if(!(a[j]=getdigit())) cnt[]++;
sum[j]=(sum[j]+(int64)a[j]*pow[i])%mod;
}
for(register int j=m-;~j;j--) {
tmp[cnt[a[rank[j]]]--]=rank[j];
}
std::swap(rank,tmp);
}
std::reverse(&rank[],&rank[m]);
for(register int i=;i<q;i++) {
for(register int i=;i<m;i++) a[i]=getdigit();
int last1=INT_MIN,first0=INT_MAX;
for(register int i=m-;~i;i--) {
if(a[rank[i]]) {
last1=i;
break;
}
}
for(register int i=;i<m;i++) {
if(!a[rank[i]]) {
first0=i;
break;
}
}
if(last1>first0) {
puts("");
continue;
}
const int sum1=last1==INT_MIN?pow[n]:sum[rank[last1]];
const int sum2=first0==INT_MAX?:sum[rank[first0]];
printf("%d\n",(sum1-sum2+mod)%mod);
}
return ;
}
[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\) ...
- BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- [HNOI 2018]寻宝游戏
Description 题库链接 给出 \(n\) 个 \(m\) 位的二进制数,在每一个二进制数间插入一个 & 或 | ,第 \(0\) 个数为 \(0\) , \(0,1\) 间也要插入符 ...
- 「HNOI/AHOI2018」游戏
传送门 Luogu 解题思路 这是一道 \(O(n^2)\) 暴力加上 \(\text{random_shuffle}\) 优化 什么鬼 就可以 \(\text{AC}\) 的题. 但还是要讲一下 \ ...
- P4424-[HNOI/AHOI2018]寻宝游戏【结论】
正题 题目链接:https://www.luogu.com.cn/problem/P4424 题目大意 \(n\)个\(m\)位二进制数,开始是一个\(0\). 然后依次对所有二进制数进行\(n\)次 ...
- 【题解】Luogu P4436 [HNOI/AHOI2018]游戏
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...
- [洛谷P4436] HNOI/AHOI2018 游戏
问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...
随机推荐
- wget下载HTTPS链接
wget -c -O master.zip --no-check-certificate https://github.com/mitsuhiko/flask/archive/master.zip # ...
- bzoj 2425 [HAOI2010]计数 dp+组合计数
[HAOI2010]计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 451 Solved: 289[Submit][Status][Discus ...
- Docker Community Edition for CentOS
Docker CE for CentOS Docker CE for CentOS distribution is the best way to install the Docker platfor ...
- codeforces 854 problem E
E. Boredom Ilya is sitting in a waiting area of Metropolis airport and is bored of looking at time t ...
- HoneyPy 模拟Nginx服务器脚本
HoneyPy是一个Python写的低交互式蜜罐,可以通过自定义Plugins的方式来配置不同的场景.这里是一个模拟Nginx空白页面的代码: # Auth xiaoxiaoleo # http:// ...
- Linux 邮件服务器 之跟我一步一步来实现一个邮件系统【转】
转自:http://tchuairen.blog.51cto.com/3848118/1686875/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- C++格式输出控制
#include<iostream> #include<string> #include<vector> #include<set> #include& ...
- HDU-3374
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- k8s job的使用
1.运行一次性容器 容器按照持续运行的时间可分为两类: 服务类容器 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等. 工作类容器 工作类容器则是一次性任务,比 ...
- python基础(字符串常用、数字类型转换、基本运算符与流程控制)
一.字符串常用操作: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "Z'N'Y" # Date: 2 ...