bzoj2003 [Hnoi2010]矩阵
Description
Input
第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数的和。保证第一行与第一列的数均为0,且每个和都不超过4(P-1)。
Output
包含N行,每行M个整数,描述你求出的矩阵,相邻的整数用空格分开。(行末不要有多余空格)
Sample Input
0 0 0
0 4 5
0 5 3
Sample Output
2 2 1
1 0 0
HINT
1<=N,M<=200
1<P<=10
正解:搜索。
好像还是寒假的时候就考过这题,然而当时在爆刚另外一题以至于这题连暴力都没写。。
然而现在还是不会做,感觉这题真的好难啊。。
于是我自己肯定是讲不清楚的,所以给一个题解吧:HNOI2010题解 (里面有一个指数写错了)
还是简单提一下,大概就是先构造一个矩阵$c$,它是满足和性质的一个答案,但每个数的取值范围不一定合法。
然后我们又可以发现答案矩阵之和矩阵的第一行和第一列有关,进一步可以发现$a[i][j]$只与$c[i][j],a[1][1],a[1][j],a[i][1]$有关。
然后可以得到$a[i][j]=c[i][j]+(-1)^{i+j-1}a[1][1]+(-1)^{i-1}a[1][j]+(-1)^{j-1}a[i][1]$。
然后我们搜索第一行,每搜出一个数就根据这一列的所有数确定第一列的取值范围,如果不合法就退出搜索。
然后状态数就神奇地减少了,并且跑得飞快。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define N (510) using namespace std; const int f[]={,-}; int a[N][N],c[N][N],dn[N][N],up[N][N],n,m,p; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il int dfs(RG int j){
if (j>m) return ;
for (a[][j]=;a[][j]<p;++a[][j]){
RG int fg=,Min,Max;
for (RG int i=;i<=n;++i){
Min=(c[i][j]+f[(i+j-)&]*a[][]+f[(i-)&]*a[][j])*f[j&];
Max=(c[i][j]+f[(i+j-)&]*a[][]+f[(i-)&]*a[][j]-p+)*f[j&];
if (Min>Max) swap(Min,Max);
dn[i][j]=max(dn[i][j-],Min),up[i][j]=min(up[i][j-],Max);
if (dn[i][j]>up[i][j]){ fg=; break; }
}
if (fg && dfs(j+)) return ;
}
return ;
} int main(){
#ifndef ONLINE_JUDGE
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
#endif
n=gi(),m=gi(),p=gi();
for (RG int i=;i<=n;++i)
for (RG int j=,x;j<=m;++j)
x=gi(),c[i][j]=x-c[i-][j]-c[i][j-]-c[i-][j-],up[i][j]=p-;
for (a[][]=;a[][]<p && !dfs();++a[][]);
for (RG int i=;i<=n;++i) a[i][]=dn[i][m];
for (RG int i=;i<=n;++i)
for (RG int j=;j<=m;++j)
printf("%d%s",c[i][j]+f[(i+j-)&]*a[][]+f[(i-)&]*a[][j]+f[(j-)&]*a[i][],j<m ? " " : "\n");
return ;
}
bzoj2003 [Hnoi2010]矩阵的更多相关文章
- 【BZOJ2003】[HNOI2010]矩阵(搜索)
[BZOJ2003][HNOI2010]矩阵(搜索) 题面 懒得粘了,不难找吧. 题解 看的学长写的题解,也懒得写了 大概是这样的. 不难发现只需要确定第一行和第一列就能确定答案,而确定第一行之后每确 ...
- [HNOI2010] 矩阵 matrix
标签:dfs+剪枝. 题解: 这道题看着就像一道dfs题目,没有什么算法可以用来算这个东西,于是想想暴搜. 如果我们确定因为是2*2的子矩阵的和,如果确定了其中三个,那么就可以确定第四个,发现如果确定 ...
- 【bzoj2003】[Hnoi2010]Matrix 矩阵
首先可以知道,如果已知第一行和第一列的数,那么可以很容易的计算出其余的数.进一步的,如果笔算将每个数的表达式写出可以得出如下结论: 第i行的第j个数(i>1,j>1)只与(1,1),(i, ...
- 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法
[BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...
- [BZOJ 2004] [Hnoi2010] Bus 公交线路 【状压DP + 矩阵乘法】
题目链接: BZOJ - 2004 题目分析 看到题目完全不会..于是立即看神犇们的题解. 由于 p<=10 ,所以想到是使用状压.将每个连续的 p 个位置压缩成一个 p 位 2 进制数,其中共 ...
- [HNOI2010]MATRIX 矩阵
Description Input 第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数 ...
- BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...
- BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定 ...
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
随机推荐
- ajax请求方法及参数说明
$.ajax()请求示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- oracle 操作实例(一)----redolog 损坏恢复
一,实验前的准备 数据库全备保证自己没成功还能补救一下 vim full.sh export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACL ...
- c++ MFC图像处理CImage类常用操作代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9598974.html MFC图像处理CImage类常用操作 CImage类头文件为#inclu ...
- 请以excel管理你的接口测试用例
闲话休扯,上需求:自动读取.执行excel里面的接口测试用例,测试完成后,返回错误结果并发送邮件通知. 分析: 1.设计excel表格2.读取excel表格3.拼接url,发送请求4.汇总错误结果.发 ...
- matlab中如何根据t检验参数查找t检验值
这个问题花了一些时间.先看图 这个是t检验里面的公式,但是如何在matlab中找到该式子对应的值,我现在才知道. 就是这样:x=tinv(1-α/2,n-1)----t(n)分布的上侧α分位数 ...
- 1、Angular2 Component 组件
angular2借鉴了.http://www.cnblogs.com/lewis617/p/5191007.html 导入了自己的思维方式 1.基本属性 2.*语法与template标签 3.组件的嵌 ...
- 使用Git(msysgit)和TortoiseGit上传代码到GitHub
1.准备 下载Git for Windows (msysgit) 下载TortoiseGit 安装过程很简单,一直点击下一步到完成即可. 2.配置TortoiseGit 1.双击TortoiseGit ...
- 数组和矩阵(1)——Find the Duplicate Number
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro ...
- Bash 终端快捷键
在终端下输大量的命令,有些快捷键还是挺有帮助的. 跳跃 跳到最后 ctrl + e (end) 跳到最前 ctrl + a (abcde....) 向后跳一个单词 alt + 右方向键 向前跳一个单词 ...
- spring事务之多个业务之间怎么共享用同一个事务
应用场景:一个月前在学校做一个羽毛球馆的项目时,那个时候用的是springboot,然后项目分成几个模块,教练模块,学生模块,管理员模块,场地模块等等,然后Service层是按模块化进行的设计. 但是 ...