题意

题目链接

Sol

神仙题Orz

Orz zbq爆搜70。。

考虑"与"和"或"的性质

\(0 \& 0 = 0, 1 \& 0 = 0\)

\(0 \mid 1 = 1, 1 \mid 1 = 1\)

也就是说某一个数\(\& 0\)之后不管之前是什么,现在的值变为\(0\)

某一个数\(\mid 1\)之后不管之前的是什么,现在的值变为\(1\)

继续考虑

\(0 \& 1 = 0, 1 \& 1 = 1\)

\(0 \mid 0 = 0, 1 \mid 0 = 1\)

这个时候我们把\(\&\)看做是1,\(\mid\)看做是\(0\)

那么对于上面这两条式子,可以看出若某个数和前面的运算符相同,之前的值不会发生改变

这时候考虑如何计算答案,对于每次询问,若某一位上是\(1\)

那么我们把每一列上的数和他之前的操作符分别拿出来看成一些序列,显然这个序列要满足最后一个\(\mid 1\)要在\(\& 0\)之后

那么这两个序列应该长这个样子:

\(101010 \dots 0 \dots 1\)

\(101010 \dots 1 \dots 0\)

我们会惊奇的发现,第一个式子一定大于第二式子。同理如果询问的位置是\(0\)的话,第一个式子应该小于第二个式子

又因为第二个式子的\(0/1\)可以任意取。那么答案应该是\(min_1 - max_0\),\(min_1\)表示询问位置上的值是\(1\)对应的列的最小值(每一列的第一行是最低位)。

这样的复杂度是\(O(nmq)\)

实际上每次询问至于每一列的大小有关,我们可以先按照字符串的大小排一遍序(搞出类似后缀数组中的sa和rak数组),这样每次询问就只需要计算两个串的答案了

复杂度:\(O(mn\log m + mq)\)

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int MAXN = 5e5 + 10, INF = 1e9 + 7, mod = 1000000007;
  5. template<typename A, typename B> inline void chmax(A &x, B y) {
  6. x = x > y ? x : y;
  7. }
  8. template<typename A, typename B> inline void chmin(A &x, B y) {
  9. x = x < y ? x : y;
  10. }
  11. template<typename A, typename B> inline void add2(A &x, B y) {
  12. x = (x + y >= mod ? x + y - mod : x + y);
  13. }
  14. inline int read() {
  15. char c = getchar(); int x = 0, f = 1;
  16. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  17. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  18. return x * f;
  19. }
  20. int N, M, Q, v[MAXN], rak[MAXN], po2[MAXN], sa[MAXN], val[MAXN];
  21. char a[1002][5002], q[5001];
  22. int comp(const int &x, const int &y) {
  23. for(int i = N; i >= 1; i--)
  24. if(a[i][x] == '0' && a[i][y] == '1') return 1;
  25. else if(a[i][x] == '1' && a[i][y] == '0') return 0;
  26. return 0;
  27. }
  28. int trans(int id) {
  29. int ans = 0;
  30. for(int i = N; i >= 1; i--)
  31. if(a[i][id] == '1') add2(ans, po2[i - 1]);
  32. return ans;
  33. }
  34. int main() {
  35. // freopen("a.in", "r", stdin);
  36. N = read(); M = read(); Q = read(); po2[0] = 1;
  37. for(int i = 1; i <= N; i++) scanf("%s", a[i] + 1), po2[i] = (po2[i - 1] * 2) % mod;
  38. for(int i = 1; i <= N; i++) a[i][M + 1] = '1', a[i][0]= '0';
  39. for(int i = 1; i <= M + 1; i++) sa[i] = i;
  40. sort(sa + 1, sa + M + 2, comp);
  41. for(int i = 1; i <= M + 1; i++) rak[sa[i]] = i;
  42. for(int i = 1; i <= M + 1; i++) val[i] = trans(i); val[M + 1]++;//不++就比答案少1,加了莫名其妙就过了。。。
  43. for(int i = 1; i <= Q; i++) {
  44. scanf("%s", q + 1);
  45. int r = M + 1, l = 0;
  46. for(int j = 1; j <= M; j++)
  47. if(q[j] == '1') chmin(r, rak[j]);
  48. else chmax(l, rak[j]);
  49. if(l > r) puts("0");
  50. else cout << (val[sa[r]] - val[sa[l]] + mod) % mod << '\n';
  51. }
  52. return 0;
  53. }
  54. /*
  55. 3
  56. 0 1 1
  57. 5 7 3
  58. */

洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)的更多相关文章

  1. [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)

    P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...

  2. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...

  3. [洛谷P4436] HNOI/AHOI2018 游戏

    问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...

  4. 【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)

    题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变 ...

  5. 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)

    点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...

  6. 洛谷 P4437 [HNOI/AHOI2018]排列(贪心+堆,思维题)

    题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_ ...

  7. 洛谷P4438 [HNOI/AHOI2018]道路(dp)

    题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...

  8. 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)

    题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...

  9. [HNOI/AHOI2018]寻宝游戏

    题目大意: $n(n\le1000)$个$m(m\le5000)$位的二进制数,第$0$个数为$0$.用$\wedge$和$\vee$将这些数连接起来.$q(q\le1000)$次询问,每次给定一个$ ...

随机推荐

  1. sudo rm -rf iTunes.app Operation not permitted

    https://www.howtogeek.com/230424/how-to-disable-system-integrity-protection-on-a-mac-and-why-you-sho ...

  2. 小鬼难缠--python小bug备忘

    今天编译pyhon做人脸识别,遇到几个问题,做个记录吧. 编译报错: File "harrClassifier.py", line 17, in <module> fl ...

  3. Liferay7 BPM门户开发之5: Activiti和Spring集成

    参考文档: https://github.com/jbarrez/spring-boot-with-activiti-examplehttps://github.com/sxyx2008/spring ...

  4. PHP-----浅谈垃圾回收机制

    前言 大多数编程语言都会有自身的垃圾回收机制,php也不例外.经常听很多人说gc,也就是垃圾回收器,全程为Garbage Collection. 在php5.3之前,是不包括垃圾回收机制的,也没有专门 ...

  5. python之斐波那契数列递归推导在性能方面的反思

    在各种语言中,谈到递归首当其冲的是斐波那契数列,太典型了,简直就是标杆 一开始本人在学习递归也是如此,因为太符合逻辑了 后台在工作和学习中,不断反思递归真的就好嘛? 首先递归需要从后往前推导,所有数据 ...

  6. 14-01 Java matches类,Pattern类,matcher类

    Pattern类 正则表达式常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') B:字符类 [ ...

  7. numpy中pad函数的常用方法

    一.参数解释 ndarray = numpy.pad(array, pad_width, mode, **kwargs) array为要填补的数组 pad_width是在各维度的各个方向上想要填补的长 ...

  8. SQLi Lab的视频教程和文字教程

    SQLi Lab 系列的文字和视频(需要FQ),讲解的很好 SQLi Lab Series - Introduction SQLi Lab Series - Error Based SQLi Lab ...

  9. jq的ajax交互封装

    jq封装的ajax,然后 在此前和此后都是很多要考虑的  ,何不 想想构思封装下. 下面: 基本上网页都存在各种ajax,使得网页变得更加易于操作. 举个长长的例子吧: <input type= ...

  10. spring-session-data-redis解决session共享的问题

    分布式系统要做到用户友好,需要对用户的session进行存储,存储的方式有以下几种: 本地缓存 数据库 文件 缓存服务器 可以看一些不同方案的优缺点 1.本地机器或者本地缓存.优点:速度快  缺点:服 ...