为了方便,令$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. 如何访问位于内网的Ubuntu主机

    如何访问位于内网的Ubuntu主机 内网主机为Ubuntu桌面版 内网主机Ubuntu字符串界面版 SSH远程主机管理工具推荐 SSH远程文件访问工具推荐 如何访问位于内网的Ubuntu主机 内网主机 ...

  2. OO第四单元UML作业总结暨OO课程总结

    目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...

  3. Sharding-JDBC自定义复合分片算法

    Sharding-JDBC自定义复合分片算法 一.背景 二.需求 1.对于客户端操作而言 2.对于运营端操作而言 三.分片算法 1.客户id和订单id的生成规则 2. 确定数据落在那个表中 3.举例说 ...

  4. 【Golang详解】go语言中并发安全和锁

    go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 [锁]详解区分 互斥锁.⾃旋锁.读写锁.乐观锁.悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号 ...

  5. 如何理解Stand SPI Dual SPI 和Quad SPI??

    1.首先看一下接口 Standard SPI: CLK, /CS, DI, DO, /WP, /Hold Dual SPI: CLK, /CS, IO0, IO1, /WP, /Hold Quad S ...

  6. HDI PCB一阶和二阶和三阶如何区分??

      一阶板,一次压合即成,可以想像成最普通的板二阶板,两次压合,以盲埋孔的八层板为例,先做2-7层的板,压好,这时候2-7的通孔埋孔已经做好了,再加1层和8层压上去,打1-8的通孔,做成整板.三阶板就 ...

  7. 常用Java API:Math类

    求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double a, doubleb) Math.min(long ...

  8. Register Abstraction(9)

    This post will explain how to use the UVM Register Abstraction Layer (RAL) to generate register tran ...

  9. 在c中使用正则表达式

    今天学习编译原理的时候,用c写一个简易的文法识别器实验遇到了一个问题:要用正则表达式去识别正则文法里面的A->ω,A->Bω, 其中ω属于T的正闭包,也就是说我们对正则文法的产生式进行抽象 ...

  10. sum-root-to-leaf-numbers leetcode C++

    Given a binary tree containing digits from0-9only, each root-to-leaf path could represent a number. ...