loj2494 [hnoi2018]寻宝游戏
题意:给你n个元素的数组a。你可以在每个元素之前添加and和or的符号。每次询问最后变成r有多少种添号情况。
n<=1000,m<=5000,q<=1000.
标程:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1e9+;
const int N=;
typedef long long ll;
int n,m,q,bin[N],tmp[N],rnk[N],bit[],a[N],sum[N];
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') {x=(x<<)+(x<<)+ch-'';break;}
return x;
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
bin[]=;
for (int i=;i<=m;i++) rnk[i]=i;
for (int i=;i<=n;i++) bin[i]=(ll)bin[i-]*%mod;
for (int i=;i<=n;i++)
{
bit[]=bit[]=;
for (int j=;j<=m;j++) bit[a[j]=read()]++,sum[j]=((ll)sum[j]+(ll)bin[i-]*a[j]%mod)%mod;
bit[]+=bit[];
for (int j=m;j>=;j--) tmp[bit[a[rnk[j]]]--]=rnk[j];
swap(tmp,rnk);
}
reverse(rnk+,rnk+m+);
while (q--)
{
for (int i=;i<=m;i++) a[i]=read();
int mx=,mn=m+;
for (int i=;i<=m;i++)
if (a[rnk[i]]==) mn=min(mn,i);else mx=max(mx,i);
if (mx>mn) {puts("");continue;}
int sum1=(rnk[mx]==)?bin[n]:sum[rnk[mx]],//注意运算符二进制的长度为n
sum2=(rnk[mn]==)?:sum[rnk[mn]];
printf("%d\n",((ll)sum1-sum2+mod)%mod);
}
return ;
}
易错点:1.注意运算符二进制的长度为n。bin要处理到2^n。
题解:计数排序+性质/从后往前推+bitset
bitset的做法:我们从后往前考虑,由最后一个数An和Ans可以推得前n-1个数的运算和x。
枚举该位之前填&还是|,每一位有八种情况:
x&1=1 x=1
x&1=0 x=0
x&0=1 无解,直接跳出
x&0=0 ?任意
x|1=1 ?任意
x|0=1 x=1
x|1=0 无解,直接跳出
x|0=0 x=0
无解不考虑,返回0。
我们发现非任意的和Ans的答案是一样的,所以不用保存,只用bitset维护一样哪几个是?即可(这个可以自定义运算求)。如果都是?,那么接下来就没有限制了,返回2的若干次。
但是枚举&和|,复杂度真的是对的吗?如果某一位相异,那么运算符唯一确定。反之是所有位相同的情况,得到的一定是111???,000???的这种形式。
接下来如果同样所有位相同,以111???为例,推出来x要么全是?,直接返回,要么仍是全1,相当于也变成了唯一确定的状态。
所以不能唯一确定的只有一次。好像会卡一点,手写bitset较宜。
时间复杂度O(nmq/w)。
出题人给的解法:
设x为符号的二进制表示第i个数之前的符号如果是and,x[i]=1,反之x[i]=0。
对于给出数列的每一位统计bi,第n个数的第i位是作为bi的最高位。
容易发现,当x<bi时,最后答案的第i位应该是1,反之为0。
那么对于每一个询问数,就可以列出关于x的不等式了。最后算出解区间中有多少个数即可。
时间复杂度O(mq)。
loj2494 [hnoi2018]寻宝游戏的更多相关文章
- 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)
[BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...
- 5285: [Hnoi2018]寻宝游戏
5285: [Hnoi2018]寻宝游戏 链接 分析: 从下面依次确定运算符号,然后在确定的过程中,需要确定的位数会逐渐减少.比如最后有一个1,如果在从下往上确定了一个or 1,那么再往前可以随便选了 ...
- BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)
BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...
- bzoj 5285: [Hnoi2018]寻宝游戏
Description Solution 把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵 把每一列压成一个二进制数,其中最高位是最下面的元素 然后就有了 \(m\) 个二进制数 ...
- HNOI2018寻宝游戏
https://www.luogu.org/problemnew/show/P4424 题解 我们首先按位考虑. 如果有一位最终的结果为1,那么我们可以把树的序列看成一个二进制数,先出现的在底位,后出 ...
- bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...
- [HNOI2018]寻宝游戏
Description: 给出\(n\)个长为\(m\)的01串,第0个为0,同时给出\(q\)个询问串,每次向其中添加\(n\)个\(\&\)或\(|\)符号,求使这些串按顺序运算得到询问串 ...
- 【比赛】HNOI2018 寻宝游戏
考试的时候就拿了30points滚粗了 听说myy对这题的倒推做法很无奈,官方题解在此 正解思路真的很巧妙,也说的很清楚了 就是分别考虑每一位,会发现题解中的那个性质,然后把询问的二进制数按照排序后的 ...
- [HNOI2018]寻宝游戏(题解转载自别处)
题解(自别处转载): Luogu CSDN 这题关键是将运算符也替换成0,1 然后在运算符与原串混杂里找规律. 而且替换的方式也有所要求,考场上两种替换方式都要尝试. #include <bit ...
随机推荐
- Devstack配置负载均衡,负载均衡版本V2
本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...
- 洛谷P3959——宝藏
传送门:QAQQAQ 题意: 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了$n$个深埋在地下的宝藏屋, 也给出了这$n$个宝藏屋之间可供开发的$m$条道路和它们的长度. 小明决心亲自前往挖掘所有 ...
- 802.11ac wave2的前世今生
2015年下半年,高通.博通.RTL等芯片厂商相继发布了满足802.11ac wave2要求的芯片,WLAN及终端厂商也迅速跟进推出相应的产品和终端.802.11ac wave2在多方推动下于2015 ...
- C++数据类型之字符串类型&布尔类型&数据的输入
字符串型 **作用**:用于表示一串字符 **两种风格** 1. **C风格字符串**: char 变量名 [ ] = "字符串值" 2.**C++风格字符串**: stri ...
- Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(前言)
简单介绍一下,本框架的基本功能点: Spring:整个框架的主体部分,这个自不用说. SpringMVC:MVC部分我还是比较喜欢Spring的. MyBatis:选型的时候选择这个ORM主要也是考虑 ...
- 常见PID里面的像素大小
因为tensorflow/models里faster R-cnn目前识别的好像是按照像素比上图片大小来识别的,所以在这里统计一下各个元件的像素大小的范围 DCS:70~200
- (转)lua protobuffer的实现
转自: http://www.voidcn.com/article/p-vmuovdgn-bam.html (1)lua实现protobuf的简介 需要读者对google的protobuf有一定的了解 ...
- BZOJ2152 聪明可可 点分治
题意传送门 思路:基本的点分治思路,num数组记录从u点开始路径长度分别为1或者2或者3的路径长度(取模3意义下),然后做一个简单的容斥就好了. 为了避免计数的麻烦,<u,u>这样的点单独 ...
- 如何检测 Web 服务请求丢失问题
导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测.故障演练.JVM.应用容器.服务框架.流量调度.监控.诊断等多个技术领域,以更结构化的 ...
- day17 文件处理及简单函数
Python之路,Day5 = Python基础5 常亮 用大写来做提示 chr() # 数字转字符ord() # 字符转数字 读文件 要以读文件的模式打开一个文件对象,使用Python内置的open ...