BZOJ

LOJ

洛谷

话说vae去年的专辑就叫寻宝游戏诶

只有我去搜Mystery Hunt和infinite corridor了吗...


同样按位考虑,假设\(m=1\)。

我们要在一堆\(01\)中填\(\&\)和\(|\)。注意到对于任意数\(x\),\(x\&0=0\),\(x\&1=x\),\(x|0=x\),\(x|1=1\)。也就是\(\&1\)和\(|0\)没有影响,而\(\&0\)和\(|1\)相当于直接赋值。

如果要求最后结果是\(1\),那我们要在某个\(1\)前面填\(|\),且这之后的位置只能\(1\)前填\(\&\)、\(0\)前填\(|\);若最后结果是\(0\),同理找到某个\(0\)在前面填\(\&\),后面位置的\(1\)前填\(\&\)、\(0\)前填\(|\)。

&=1,|=0,然后设操作串=\(y\),从后往前是从高位到低位,那如果\(x>y\)最后结果是\(1\),如果\(x<y\)结果是\(0\)(很好理解,因为要找到从后往前第一个不同的位置,就是难想到...)。

因为初始是\(0\)所以\(x=y\)是结果也是\(0\)。

也就是说,这一位要求是\(1\),则有\(y<x\);要求是\(0\),有\(y\geq x\)。

扩展到\(m\)位,对于每一次询问就可以得到\(m\)个这样的不等式,设解出来是\(l\leq y<r\),答案就是\(r-l\)。

怎么做解决了,但是直接实现起来还是有点麻烦...

可以先将\(m\)个\(x\)从小到大排序,对于询问\(s\)就for一遍找到\(s_i=1\)的位置上最小的\(x\)记作\(r\),再for一遍找到\(s_i=0\)的位置上最大的\(x\)记作\(l\),答案就是\(\max(r-l,0)\)(注意初始\(l=0,r=2^m\)...)。

可以基数排序,然而不会(sort还是会的)...感觉后缀数组白学了= =(sort也能随便过就是了)

每次以当前是\(0\)是\(1\)为第一关键字,之前的排名为第二关键字,背一下SA的板子就好了...

复杂度\(O((n+q)m)\)。


//940kb	820ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define mod 1000000007
#define Mod(x) x>=mod&&(x-=mod)
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
#define gc() getchar()
typedef long long LL;
const int N=5005; int rk[N],tmp[N],pw[N],x[N],X[N],s[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void Read(int n)
{
register char c=gc(); while(c!='0'&&c!='1') c=gc();
s[1]=c-48;
for(int i=2; i<=n; s[i++]=gc()-48);
} int main()
{
// freopen("hunt.in","r",stdin);
// freopen("hunt.out","w",stdout); int n=read(),m=read(),Q=read();
pw[1]=1;
for(int i=2; i<=n+1; ++i) pw[i]=pw[i-1]<<1, Mod(pw[i]);
int *rk=::rk,*tmp=::tmp;
for(int i=1; i<=m; ++i) rk[i]=i;
for(int i=1,tm[2]; i<=n; ++i)
{
tm[0]=0, tm[1]=m, Read(m);
for(int j=1; j<=m; ++j) s[j]?Add(x[j],pw[i]):++tm[0];
for(int j=m; j; --j) tmp[tm[s[rk[j]]]--]=rk[j];
std::swap(rk,tmp);
}
for(int i=1; i<=m; ++i) X[i]=x[rk[i]];//rk[i]=j 排第i名的是j(SA里的sa...)
X[m+1]=pw[n+1];
while(Q--)
{
Read(m); int L=0,R=m+1;//Init: L=0, R=2^n(n位二进制数)
for(int i=1; i<=m; ++i) if(s[rk[i]]) {R=i; break;}
for(int i=m; i; --i) if(!s[rk[i]]) {L=i; break;}
printf("%d\n",R<L?0:(X[R]-X[L]+mod)%mod);
} return 0;
}

BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)的更多相关文章

  1. 5285: [Hnoi2018]寻宝游戏

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

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

    [BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...

  3. loj #2508. 「AHOI / HNOI2018」游戏

    #2508. 「AHOI / HNOI2018」游戏 题目描述 一次小 G 和小 H 在玩寻宝游戏,有 nnn 个房间排成一列,编号为 1,2,…,n,相邻房间之间都有 111 道门.其中一部分门上有 ...

  4. BZOJ.5288.[AHOI/HNOI2018]游戏(思路 拓扑)

    BZOJ LOJ 洛谷 考虑如何预处理每个点能到的区间\([l,r]\). 对于\(i,i+1\)的一扇门,如果钥匙在\(i\)的右边,连边\(i\to i+1\),表示从\(i\)出发到不了\(i+ ...

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

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

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

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

  7. BZOJ.3991.[SDOI2015]寻宝游戏(思路 set)

    题目链接 从哪个点出发最短路径都是一样的(最后都要回来). 脑补一下,最短路应该是按照DFS的顺序,依次访问.回溯遍历所有点,然后再回到起点. 即按DFS序排序后,Ans=dis(p1,p2)+dis ...

  8. BZOJ.5289.[AHOI/HNOI2018]排列(贪心 heap)

    BZOJ LOJ 洛谷 \(Kelin\)写的挺清楚的... 要求如果\(a_{p_j}=p_k\),\(k\lt j\),可以理解为\(k\)要在\(j\)之前选. 那么对于给定的\(a_j=k\) ...

  9. BZOJ.5290.[AHOI/HNOI2018]道路(树形DP)

    BZOJ LOJ 洛谷 老年退役选手,都写不出普及提高DP= = 在儿子那统计贡献,不是在父亲那统计啊!!!(这样的话不写这个提高DP写记忆化都能过= =) 然后就令\(f[x][a][b]\)表示在 ...

随机推荐

  1. PDF文件编辑技巧之PDF书签怎么设置

    纸质的文件想要添加书签就直接拿笔书写就可以,Word文件怎么添加书签相信大家也都知道,那么PDF文件的书签要怎么设置的呢,是不是有很多小伙伴不知道该怎么做呢,不要担心,今天小编就来跟大家分享一下在PD ...

  2. Jmeter测试demo

    复制代码,保存为.jmx文件 需要安装插件: JMeterPlugins-ExtrasLibs E:\软件\apache-jmeter-3.0\lib\ext <?xml version=&qu ...

  3. C++ Primer 笔记——类成员指针

    1.当我们初始化一个成员指针或为成员指针赋值时,该指针并没有指向任何数据.成员指针指定了成员而非成员所属的对象,只有当解引用成员指针时,我们才提供对象信息. 2.和普通的函数指针类似,如果成员存在重载 ...

  4. C++中的继承(1) 继承方式

    1.继承与派生  继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单 ...

  5. 滴水穿石-04Eclipse中常用的快捷键

    一:常用快捷键 1:内容辅助键  :Alt+/ :main + 该快捷键 :自动生成main方法 :syso + 该快捷键 :自动生成System.out.println();语句 :提示作用 :内容 ...

  6. OpenCV-Python入门教程5-阈值分割

    一.固定阈值分割 import cv2 import matplotlib.pyplot as plt # 灰度图读入 img = cv2.imread('gradient.jpg', 0) # 阈值 ...

  7. js调试console.log使用总结图解

    一 实例 打印字符串和对象: 可展开对象查看内部情况: 看一下console对象本身的定义情况: 输出对象情况: utag对象所在文件: 输出对象: 二 Console.log 总结 1   如果你j ...

  8. SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包

    写这篇日志的时候,我已经完成了这个目标,并且中间经历了一次面试.现在回过头看,已经觉得印象不那么深刻了,果然还是一边思考,一边记录这样最好.但我还是严格要求自己,从新做了梳理,对相关配置进行了整理和说 ...

  9. Oracle Instant Client(即时客户端) 安装与配置

    一.下载 下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 这是Ora ...

  10. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡

    题解: 网上有一种复杂的方法..好像复杂度并没有优势就没看 定义f[i]表示i的期望经过次数,f[i]=sigma{f[j]*p/q/du[j]}+(i==1); 然后高斯消元就可以了 最后求出来的f ...