【BZOJ2003】[HNOI2010]矩阵(搜索)

题面

懒得粘了,不难找吧。

题解

看的学长写的题解,也懒得写了

大概是这样的。

不难发现只需要确定第一行和第一列就能确定答案,而确定第一行之后每确定一行的第一个数,这一行就全部确定了。所以只需要保证第一行和第一列的字典序最小就好了。

首先我们随意构造一组解,不难发现如果我们要给(1,1)位置上的数\(+1\)的话,那么黑白染色之后一部分位置\(+1\),一部分位置\(-1\)才能重新满足平衡。

所以我们先枚举(1,1),又不难发现一个位置在\((1,1)\)确定之后,它可以填的数字之和这一行的第一个和这一列的第一个数字相关了,那么我们枚举第一行的数字,能够通过值域限制反解出这一行的第一个数字的限制来判断是否合法。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 250
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,P,a[MAX][MAX],L[MAX][MAX],R[MAX][MAX];
int pw(int x){return (x&1)?1:-1;}
bool dfs(int y)
{
if(y>m)return true;
for(a[1][y]=0;a[1][y]<P;++a[1][y])
{
bool fl=true;
for(int i=2;i<=n;++i)
{
int l=a[i][y]+a[1][1]*pw(i+y)+a[1][y]*pw(i);
int r=l-(P-1);l*=pw(y+1);r*=pw(y+1);
if(l>r)swap(l,r);
L[i][y]=max(L[i][y-1],l);R[i][y]=min(R[i][y-1],r);
if(L[i][y]>R[i][y]){fl=false;break;}
}
if(fl&&dfs(y+1))return true;
}
return false;
}
int calc(int i,int j){return a[i][j]+pw(i+j)*a[1][1]+pw(j)*L[i][m]+pw(i)*a[1][j];}
void output()
{
for(int i=1;i<=n;++i,puts(""))
for(int j=1;j<=m;++j)
if(j==1&&i>1)printf("%d ",L[i][m]);
else if(i==1&&j>1)printf("%d ",a[1][j]);
else printf("%d ",calc(i,j));
puts("");
}
int main()
{
n=read();m=read();P=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
a[i][j]=read();
if(i!=1&&j!=1)a[i][j]-=a[i][j-1]+a[i-1][j]+a[i-1][j-1];
R[i][j]=P-1;
}
for(a[1][1]=0;a[1][1]<P;++a[1][1])
if(dfs(2)){output();return 0;}
return 0;
}

【BZOJ2003】[HNOI2010]矩阵(搜索)的更多相关文章

  1. bzoj2003 [Hnoi2010]矩阵

    Description Input 第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数 ...

  2. [HNOI2010] 矩阵 matrix

    标签:dfs+剪枝. 题解: 这道题看着就像一道dfs题目,没有什么算法可以用来算这个东西,于是想想暴搜. 如果我们确定因为是2*2的子矩阵的和,如果确定了其中三个,那么就可以确定第四个,发现如果确定 ...

  3. leetcode74:二维矩阵搜索问题

    使用递归的方式解决,对于matrix,在左上角x,y,右下角xx,yy组成的区域内搜索target. mx=x和xx的中点,my=y和yy的中点 判断matrix[mx][my],如果它大于targe ...

  4. R dataframe 遗忘, which 矩阵搜索

    A data frame is used for storing data tables. It is a list of vectors of equal length. For example, ...

  5. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  6. 【剑指 Offer】12.矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格. 如果一条路径经过了矩阵的某一格,那么 ...

  7. CSDN总结的面试中的十大算法

    1.String/Array/Matrix 在Java中,String是一个包含char数组和其它字段.方法的类.如果没有IDE自动完成代码,下面这个方法大家应该记住: toCharArray() / ...

  8. [算法专题] 二分搜索&排序数组

    基础知识 二分非递归写法: int binary_search(const int a[], const int size, const int val) { int lower = 0; int u ...

  9. NOIP2002-2017普及组题解

    虽然普及组一般都是暴力省一,但是有一些题目还是挺难的qwq个人觉得能进TG的题目会在前面打上'*' NOIP2002(clear) #include<bits/stdc++.h> usin ...

随机推荐

  1. 2011 noip 提高组

    首先吐槽:刚刚写着写着突然蓝屏了,,emmm,写到最后一题了蓝屏了. 当时我的内心是崩溃的. 然后,旁边的大佬默默来了一句:论保存草稿的重要性. 连着蓝了三次之后开了防火墙,然后,,我左边那位同学又开 ...

  2. Nagios监控系统部署(源码)

    1. 概述2. 部署Nagios2.1 创建Nagios用户组2.2 下载Nagios和Nagios-plugin源码2.3 编译安装3. 部署Nagios-plugin3.1 编译安装nagios- ...

  3. Webpack 2 视频教程 003 - Webpack 项目初始化

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  4. vs2017+opencv4.0.1安装配置详解(win10)

    一.说明 笔者之前已经安装过了vs2017,对应的opencv是3.4.0版本的.但现在想体验下opencv4的改变之处,所以下载了最新的opencv4.0.1. vs2017的安装请自行搜索安装,本 ...

  5. Visual Studio2015安装过程以及单元测试

    安装环境: 安装版本: Visual Studio2015 安装过程: 因为我是在第一次老师安排的作业的时候感觉VC++6.0不如VS方便所以才装的Visual Studio2015,又安装了点插件, ...

  6. 安装Visual Studio 2013以及简单使用

    首先,在网上找到安装Visual Studio 2013的教程以及相关软件资源http://jingyan.baidu.com/article/09ea3ede3b2496c0afde3944.htm ...

  7. Week2 代码复查

    代码复查 http://blog.fogcreek.com/increase-defect-detection-with-our-code-review-checklist-example/ 这篇博客 ...

  8. linux内核分析第七次实验

    实验: rm menu -rf git clone https://github.com/megnning/menu.git cd menu ls mv test_exec.c test.c vi t ...

  9. 数学战神app(小学生四则运算app)开发需求及进度

    项目名字:“数学战神” 开发环境:Android eclipse 团队名称:战神联盟 团队成员:陈思明,许家豪,王宏财,吴旭涛 在之前的四则运算APP中添加更多的实用功能,并在各种平台推广宣传. 预加 ...

  10. 9-Python3从入门到实战—基础之条件控制语句

    Python从入门到实战系列--目录 条件判断 if 条件判断 if 语句语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> ...