JZOJ2020年8月10日提高组T3 玩诈欺的小杉

题目

Description

是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有\(N*M\)个有黑白棋的棋子(一面为黑,一面为白),一开始都是白面朝上。

小杉可以对任意一个格子进行至多一次的操作(最多进行\(N*M\)个操作),该操作使得与该格同列的上下各2个格子以及与该格同行的左右各1个格子以及该格子本身翻面。

例如,对于一个\(5*5\)的棋盘,仅对第三行第三列的格子进行该操作,得到如下棋盘(0表示白面向上,1表示黑面向上)。

00100

00100

01110

00100

00100

对一个棋盘进行适当的操作,使得初始棋盘(都是白面朝上)变成已给出的目标棋盘的操作集合称作一个解法。

小杉的任务是对给出的目标棋盘求出所有解法的总数。

Input

每组测试数据的第一行有3个正整数,分别是N和M和T(1<=N,M<=20,1<=T<=5)

接下来T个目标棋盘,每个目标棋盘N行,每行M个整数之前没有空格且非0即1,表示目标棋盘(0表示白面朝上,1表示黑面朝上)

两个目标棋盘之间有一个空行。

特别地,对于30%的数据,有1<=N,M<=15

Output

对每组数据输出T行,每行一个整数,表示能使初始棋盘达到目标棋盘的解法总数

Sample Input

4 4 2

0010

0010

0111

0010

0010

0110

0111

0010

Sample Output

1

1

Hint

对于输入的数据,两个目标棋盘各有一种解法

1:

0000

0000

0010

0000

2:

1011

1101

0111

1011

其中1表示对该格进行操作,0表示不操作

题解

题意

给出一个矩阵,问经过多少次操作使得原矩阵(全0)转换成目标矩阵

每次操作将会翻转当前格子和左右各一个及上下各两个的颜色

分析

题目转一下:多少操作使得目标变成全0

很容易想到状压\(DP\)(今天第3道)

发现,上一列的情况会影响当前这列的选择

看:

00000
00000
01000
00000
00000

现在我们做到了第3列

那么第3列第3行这个位置就必须要翻转

因为到了第4列就无法影响到第2列的那个1了

所以说我们可以构造第0列的01情况

然后根据每列的01情况选取位置进行翻转

最后看一下第\(m\)列是否为全0即可

时间复杂度\(O(2^n*n^3)\)

思考优化

发现翻转和异或十分相似

看一下样例1

00100
00100
01110
00100
00100

第2行和第3行异或

00100
00100
01010
00100
00100

把第2行的状态往下一位,再异或第3行

00100
00100
01010
00000
00100

同理就可以搞定第3列

那么第4列再和第2列异或

00000
00000
01000
00000
00000

搞定

优化至\(O(2^n*n^2)\)

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,t,mx,i,j,ans,er,a[25][25],map[25],c[25];
char ch;
int main()
{
scanf("%d%d%d",&n,&m,&t);
mx=(1<<n)-1;
while (t--)
{
ans=0;
memset(map,0,sizeof(map));
for (i=1;i<=n;i++)
{
j=1;
ch=getchar();
while (ch!='0'&&ch!='1') ch=getchar();
while (ch=='0'||ch=='1')
{
a[i][j]=ch-'0';
ch=getchar();
j++;
}
}
for (j=1;j<=m;j++)
{
er=1;
for (i=1;i<=n;i++)
{
map[j]+=a[i][j]*er;
er*=2;
}
}
for (map[0]=0;map[0]<=mx;map[0]++)
{
for (i=0;i<=m;i++)
c[i]=map[i];
for (i=1;i<=m;i++)
{
c[i]=(c[i]^c[i-1]^(c[i-1]*2)^(c[i-1]*4)^(c[i-1]/2)^(c[i-1]/4))&mx;
c[i+1]=(c[i+1]^c[i-1])&mx;
}
if ((c[m]&mx)==0) ans++;
}
printf("%d\n",ans);
}
return 0;
}

JZOJ2020年8月10日提高组T3 玩诈欺的小杉的更多相关文章

  1. 【GDOI2007】JZOJ2020年8月10日提高组T1 夏娜的菠萝包

    [GDOI2007]JZOJ2020年8月10日提高组T1 夏娜的菠萝包 题目 Description 夏娜很喜欢吃菠萝包,她的经纪人RC每半个月就要为她安排接下来的菠萝包计划.今天是7月份,RC又要 ...

  2. JZOJ2020年8月11日提高组T3 页

    JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...

  3. 【佛山市选2013】JZOJ2020年8月7日提高组T3 海明距离

    [佛山市选2013]JZOJ2020年8月7日提高组T3 海明距离 题目 描述 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR ...

  4. 【GDKOI2014】JZOJ2020年8月13日提高组T3 壕壕的寒假作业

    [GDKOI2014]JZOJ2020年8月13日提高组T3 壕壕的寒假作业 题目 Description Input Output 输出n行.第i行输出两个整数,分别表示第i份作业最早完成的时刻以及 ...

  5. JZOJ2020年8月11日提高组T2 宝石

    JZOJ2020年8月11日提高组T2 宝石 题目 Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是 ...

  6. JZOJ2020年8月11日提高组T1 密码

    JZOJ2020年8月11日提高组T1 密码 题目 Description 在浩浩茫茫的苍穹深处,住着上帝和他的神仆们,他们闲谈着下界的凡人俗事,对人世间表现的聪明智慧,大加赞赏.今天他们正在观赏大地 ...

  7. 【SHOI2008】JZOJ2020年9月5日提高组 循环的债务

    CSP-2020倒计时:36天 [SHOI2008]JZOJ2020年9月5日提高组 循环的债务 题目 Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有 ...

  8. JZOJ2020年9月5日提高组反思

    JZOJ2020年9月5日提高组反思 T1 考试的时候没有头绪,就打了个暴力,愉快的拿到了10分的\(impossible\) 正解是\(DP\),设\(f[i][j][k]\)表示地\(i\)种币值 ...

  9. 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    [GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...

随机推荐

  1. node+express如何接收fromData

    使用express-formidable来进行解析 安装 express-formidable npm install express-formidable 在app.js里放入已下代码 const ...

  2. Python调用飞书发送消息

    一.创建飞书机器人 自定义飞书机器人操作步骤,具体详见飞书官方文档:<机器人 | 如何在群聊中使用机器人?>

  3. Round 4

    最近再次经历动荡期 博客只在小白时期记录过 已经沉寂许久 之前的工作在黄区 加班超多  阻隔了一切与外网交流的可能 只能凭记忆补一点最近一年来积累到的知识 不管怎么样 不能放弃自己啊老铁!

  4. HTML+JavaScript实现一个简单抽奖功能

    为什么会做这个东西呢,纯属好玩,闲的其实是在上次班会的时候想到的,班会的时候叫人回答问题,没人回答当时就想,我如果抽签抽到你了,你还是不回答吗??好吧,一切都是扯淡先来看看页面效果吧:点击抽取就可以抽 ...

  5. [阿里DIN]从模型源码梳理TensorFlow的形状相关操作

    [阿里DIN]从模型源码梳理TensorFlow的形状相关操作 目录 [阿里DIN]从模型源码梳理TensorFlow的形状相关操作 0x00 摘要 0x01 reduce_sum 1.1 reduc ...

  6. python_摘要_加密

    import hashlib def get_md5(username,password): md5 = hashlib.md5(username.encode('utf-8')) # 加盐 md5. ...

  7. 基于CSS3伪元素和动画绘制旋转太极图

    通过CSS3的动画知识来完成一个旋转的太极. 任务 1.创建一个div,用CSS控制其大小.边框.位置等,做成一个静态的圆形,一半为红色一半为白色. 2.用div的伪元素位置两个圆环并放置核实位置,使 ...

  8. 04 . Vue组件注册,数据交互,调试工具及组件插槽介绍及使用

    vue组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...

  9. 内核crash>>>磁盘空间小 怎么处理

    在内存发生panic时,需要把panic的日志保存下来.以方便日后进行分析. 一般主机为x86的时候,panic 使用 kdump保存log.由于它使用占用大量内存和硬盘.所以当磁盘空间不够时,就会遇 ...

  10. nginx&http 第三章 ngx 1-http ngx_http_wait_request_handler

    对于活跃的 HTTP 连接,在执行连接建立回调函数 ngx_http_init_connection 的过程中会执行 ngx_http_wait_request_handler 回调函数, 负责 HT ...