题目

洛谷 4424

分析

感觉思路比较神仙。

对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑。

对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变成 \(1\) ,「与 \(1\)」和「或 \(0\)」不会改变这一位的值。前两种操作会改变这一位的值,而后两种不会。将前两种称为「关键操作」,那么某一位最终的值取决且仅取决于这一位的最后一次「关键操作」是「与 \(0\)」还是「或 \(1\)」。如果是前者或者不存在关键操作,最终的值就是 \(0\) ,否则是 \(1\) 。

接下来就比较魔幻了。对于每一位,把每个操作符的右操作数(即题目中给定的 \(a_i\))从右到左 排成一个字符串。假定已经填入了操作符,把这些操作符中与视作 \(1\) ,或视作 \(0\) ,也 从右到左 排成一个字符串。那么,最后一个关键操作就是这两个字符串第一个不相等的地方。换句话说,比较这两个字符串,如果操作符的字符串大(即最后一个关键操作是与 \(0\) ),最终结果就是 \(0\) ,否则是 \(1\) 。

有了这个奇妙的结论,把每一位的右操作数字符串处理出来,从小到大排序(下文中位的「前」「后」是按照这个顺序排序的)。如果把操作符字符串放在某两位的右操作数字符串之间,那么前面的所有位都是 \(0\) ,后面的所有位都是 \(1\) 。如果 \(r_i\) 中最靠前的 \(1\) 在最靠前的 \(0\) 之前,则无解;否则可以确定合法的操作符字符串在哪两位之间,答案就是字典序在这两位的字符串之间的串的数量。

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <string>
using namespace std; namespace zyt
{
const int N = 1e3 + 10, M = 5e3 + 10, P = 1e9 + 7;
int arr[N][M], val[M], id[M];
basic_string<int> s[M];
bool cmps(const int a, const int b)
{
return s[a] < s[b];
}
int work()
{
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%1d", &arr[i][j]);
for (int i = 1; i <= m; i++)
{
id[i] = i;
for (int j = n, tmp = 0, cnt = 0; j > 0; j--)
{
tmp = tmp * 2 + arr[j][i], ++cnt;
if (j == 1 || cnt == 16)
s[i] += tmp, tmp = cnt = 0;
}
}
sort(id + 1, id + m + 1, cmps);
for (int i = 1; i <= m; i++)
for (int j = n; j > 0; j--)
val[i] = (val[i] * 2LL + arr[j][i]) % P;
val[m + 1] = 1;
for (int i = 1; i <= n; i++)
val[m + 1] = val[m + 1] * 2LL % P;
id[m + 1] = m + 1;
while (q--)
{
bool flag = false, no_ans = false;
static int r[M];
for (int i = 1; i <= m; i++)
scanf("%1d", r + i);
for (int i = 1; i <= m; i++)
if (r[id[i]] == 1)
flag = true;
else
no_ans |= flag;
if (no_ans)
puts("0");
else
{
bool flag = false;
for (int i = 1; i <= m; i++)
if (r[id[i]] == 1)
{
flag = true;
printf("%d\n", (val[id[i]] - val[id[i - 1]] + P) % P);
break;
}
if (!flag)
printf("%d\n", (val[id[m + 1]] - val[id[m]] + P) % P);
}
}
return 0;
}
}
int main()
{
return zyt::work();
}

【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)的更多相关文章

  1. [洛谷P3320] SDOI2015 寻宝游戏

    问题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的 ...

  2. [bzoj3991] [洛谷P3320] [SDOI2015] 寻宝游戏

    Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有 \(N\) 个村庄和 \(N-1\) 条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬 ...

  3. 洛谷 P3320 [SDOI2015]寻宝游戏

    因为寻宝路径是一个环,所以寻宝花费的最小时间与起点无关.宝应当按照所有宝藏所在位置的 dfs 序进行才能够使得花费的时间最短.设 \(dist_i\) 表示 \(i\) 到树根的最短距离,那么树上任意 ...

  4. 洛谷3320 SDOI2015寻宝游戏(set+dfs序)(反向迭代器的注意事项!)

    被\(STL\)坑害了一个晚上,真的菜的没救了啊. 准确的说是一个叫\(reverse\ iterator\)的东西,就是我们经常用的\(rbegin()\) 有一个非常重要的性质 在反向迭代器中,+ ...

  5. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

  6. 洛谷P1274-魔术数字游戏

    Problem 洛谷P1274-魔术数字游戏 Accept: 118    Submit: 243Time Limit: 1000 mSec    Memory Limit : 128MB Probl ...

  7. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  8. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

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

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

随机推荐

  1. springboot多对一关系映射

    原文:https://blog.csdn.net/h993438890/article/details/89146483 spring boot项目的创建省略创建两张表t_user 字段 主键id,u ...

  2. Java基础系列8——IO流超详细总结

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 在初学Java时,I ...

  3. <数论相关>欧几里得与拓展欧几里得证明及应用

    欧几里得算法 欧几里得算法的复杂度为O(log(n)),是一个非常高效的求最大公约数算法. 在这里不证明欧几里得算法的复杂度,有兴趣的可以访问以下链接:http://blog.sina.com.cn/ ...

  4. Qt和c/c++connect函数冲突解决方法

    在使用c/c++的connect函数时在前面写::connect()这样就可以解决了

  5. requests爬取豆瓣top250电影信息

    ''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...

  6. JMM&Thread

    1.概述 高效并发通过JAVA线程之间提高并发协调实现,在实现过程中需考虑硬件的效率和一致性,但在运算的过程中需要考虑处理器与内存的交互,所以基于高速缓存的存储交互解决的处理器与内存的方案,在对多处理 ...

  7. C# list与table的互转

    //list转化为table public static DataTable ListToDataTable<T>(List<T> entitys) { //检查实体集合不能为 ...

  8. WPF 窗体快捷键(热键)

    前言:在WPF项目开发当中,遇到了需要用到快捷键的需求,于是对热键做了一个快速学习,但是这方面的资源很少... 热键大致分为三种场景,下面用QQ的使用场景举例: 全局热键:QQ的Ctrl+Alt+A截 ...

  9. JavaScript中浅拷贝和深拷贝的区别

    JavaScript数据类型 基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null 引用数据类型:Array,object,Funct ...

  10. 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...