为了方便,令$a_{i,j}$的下标范围为$[0,n]$和$[0,m]$,$b_{i,j}$的下标范围为$[1,n]$和$[1,m]$

当确定$a_{i,0}$和$a_{0,j}$后,即可通过$b_{i,j}$来确定$a_{i,j}$,具体的有
$$
a_{i,j}=(-1)^{i+j}\sum_{1\le x\le i,1\le y\le j}(-1)^{x+y}b_{x,y}+(-1)^{j}a_{i,0}+(-1)^{i}a_{0,j}-(-1)^{i+j}a_{0,0}
$$
由于在$i=0$或$j=0$时其也满足该式子,因此现在的条件变为:构造任意整数$a_{i,0}$和$a_{0,j}$,使得对于任意$i$和$j$(符合下标范围),上述式子计算得到后的结果在$[0,V]$中(其中$V=10^{6}$)

提出$(-1)^{i+j}$,再令$B_{i,j}=\sum_{1\le x\le i,1\le y\le j}(-1)^{x+y}b_{x,y}$,即有
$$
a_{i,j}=(-1)^{i+j}(B_{i,j}+(-1)^{i}a_{i,0}+(-1)^{j}a_{0,j}-a_{0,0})
$$
令$x_{i}=(-1)^{i}a_{i,0}-a_{0,0}$和$y_{i}=(-1)^{i+1}a_{0,i}$,即$a_{i,j}=(-1)^{i+j}(B_{i,j}+x_{i}-y_{j})$

同时,条件考虑对$i+j$奇偶性分类讨论,即:

1.若$i+j$为偶数,则$-B_{i,j}\le x_{i}-y_{j}\le V-B_{i,j}$

2.若$i+j$为奇数,则$B_{i,j}\le y_{j}-x_{i}\le V+B_{i,j}$

对$x_{i}$和$y_{i}$这$n+m+2$个变量求差分约束即可,具体来说令$d_{i}$表示第$i$个变量的值,限制都可以转换为$d_{i}\le d_{j}+x$,那么连边$(i,j,x)$后求最短路即满足此性质

由于有负权,需要spfa,最坏时间复杂度为$o(T(n+m)^{3})$

求出$x_{i}$和$y_{i}$后,即有$a_{i,j}=(-1)^{i+j}(B_{i,j}+x_{i}-y_{j})$,输出即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 605
4 #define V 1000000
5 #define ll long long
6 struct Edge{
7 int nex,to;
8 ll len;
9 }edge[N*N];
10 queue<int>q;
11 int E,t,n,m,head[N],vis[N],sum[N];
12 ll d[N],b[N][N];
13 void add(int x,int y,ll z){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 edge[E].len=z;
17 head[x]=E++;
18 }
19 bool spfa(){
20 memset(d,0x3f,sizeof(d));
21 memset(vis,0,sizeof(vis));
22 memset(sum,0,sizeof(sum));
23 d[0]=0;
24 q.push(0);
25 vis[0]=1;
26 while (!q.empty()){
27 int k=q.front();
28 q.pop();
29 for(int i=head[k];i!=-1;i=edge[i].nex)
30 if (d[edge[i].to]>d[k]+edge[i].len){
31 d[edge[i].to]=d[k]+edge[i].len;
32 if (!vis[edge[i].to]){
33 q.push(edge[i].to);
34 vis[edge[i].to]=1;
35 }
36 if (++sum[edge[i].to]>n+m)return 0;
37 }
38 vis[k]=0;
39 }
40 return 1;
41 }
42 int main(){
43 scanf("%d",&t);
44 while (t--){
45 scanf("%d%d",&n,&m);
46 n--,m--;
47 E=0;
48 memset(head,-1,sizeof(head));
49 for(int i=1;i<=n;i++)
50 for(int j=1;j<=m;j++){
51 scanf("%lld",&b[i][j]);
52 if ((i+j)&1)b[i][j]*=-1;
53 b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
54 }
55 for(int i=0;i<=n;i++)
56 for(int j=0;j<=m;j++)
57 if ((i+j)&1){
58 add(i,j+n+1,V+b[i][j]);
59 add(j+n+1,i,-b[i][j]);
60 }
61 else{
62 add(j+n+1,i,V-b[i][j]);
63 add(i,j+n+1,b[i][j]);
64 }
65 if (!spfa()){
66 printf("NO\n");
67 continue;
68 }
69 printf("YES\n");
70 for(int i=0;i<=n;i++){
71 for(int j=0;j<=m;j++)
72 if ((i+j)&1)printf("%lld ",d[j+n+1]-d[i]-b[i][j]);
73 else printf("%lld ",b[i][j]+d[i]-d[j+n+1]);
74 printf("\n");
75 }
76 }
77 }

[loj3500]矩阵游戏的更多相关文章

  1. ZJOI2007矩阵游戏

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: 行交 ...

  2. 【BZOJ】1059: [ZJOI2007]矩阵游戏(二分图匹配)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1059 本题可以看出,无论怎样变化,在同一行和同一列的数永远都不会分手---还是吐槽,,我第一眼yy了 ...

  3. 【BZOJ】【1059】【ZJOI2007】矩阵游戏

    二分图完美匹配/匈牙利算法 如果a[i][j]为黑点,我们就连边 i->j ,然后跑二分图最大匹配,看是否有完美匹配. <_<我们先考虑行变换:对于第 i 行,如果它第 j 位是黑点 ...

  4. 1059: [ZJOI2007]矩阵游戏 - BZOJ

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

  5. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  6. bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1891  Solved: 919[Submit][Statu ...

  7. BZOJ 1059 矩阵游戏

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个\(N \times N\)黑白方阵进行(如同国际象棋一般,只是颜色是随意的). ...

  8. BZOJ 1059 [ZJOI2007]矩阵游戏

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2707  Solved: 1322[Submit][Stat ...

  9. bzoj 1059 [ZJOI2007]矩阵游戏(完美匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2993  Solved: 1451[Submit][Stat ...

随机推荐

  1. 低代码BPM平台

    为了做出明智的决策并为客户提供服务,员工需要在正确的环境中使用正确的工具和访问关键信息的权限.但是,当业务关键信息分散在多个现成的和自定义编码的应用程序中时,员工效率会降低,客户体验也会受到影响. 低 ...

  2. Java JDK环境变量如何配置?Java基础!

    在了解什么是Java.Java 语言的特点以及学习方法之后,本节将介绍如何搭建编写 Java JDK环境变量如何配置,只有搭建了环境才能敲代码! 学Java的都知道,JDK 是一种用于构建在 Java ...

  3. 题解 「ZJOI2018」历史

    题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...

  4. Linux环境下安装java的方法

    linux安装java步骤 方式一:yum方式下载安装 1.查找java相关的列表 yum -y list java* 或者 yum search jdk 2.安装jdk yum install ja ...

  5. HTTP状态码 详细解析汇总

    一.状态码的类别: 类别 原因短语1XX Informational(信息性状态码) 接受的请求正在处理2XX Success(成功状态码) 请求正常处理完毕3XX Redirection(重定向状态 ...

  6. NX CAM 区域轮廓铣的切削步长

    从NX3.0到NX9.0,默认都是5%.可是实际计算的精确度是不一样的.到NX8.0上发现计算速度特别慢,后来东找西找,设置这个参数可以解决.PS:请慎用!请后后面的官方解释. 官方的解释是: &qu ...

  7. 2020年09月15日-项目开发-python二次处理代码文件

    Caterpillar通过将BPMN生成为solidity代码后, 我需要对solidity代码做二次处理,即在其中的特定函数中插入event类型,以便去做事件监听. 最终生成的不仅包括solidit ...

  8. 小甲鱼零基础学python第25讲课后习题动手练习--通讯录

    小甲鱼零基础学python第25讲课后习题动手练习---通讯录 **************************通讯录要求******************************* 输入指令: ...

  9. python socket zmq

    本篇博客将介绍zmq应答模式,所谓应答模式,就是一问一答,规则有这么几条 1. 必须先提问,后回答 2. 对于一个提问,只能回答一次 3. 在没有收到回答前不能再次提问 上代码,服务端: #codin ...

  10. python 类中的公有属性 私有属性 实例属性

    class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...