[loj3500]矩阵游戏
为了方便,令$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]矩阵游戏的更多相关文章
- ZJOI2007矩阵游戏
		题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: 行交 ... 
- 【BZOJ】1059: [ZJOI2007]矩阵游戏(二分图匹配)
		http://www.lydsy.com/JudgeOnline/problem.php?id=1059 本题可以看出,无论怎样变化,在同一行和同一列的数永远都不会分手---还是吐槽,,我第一眼yy了 ... 
- 【BZOJ】【1059】【ZJOI2007】矩阵游戏
		二分图完美匹配/匈牙利算法 如果a[i][j]为黑点,我们就连边 i->j ,然后跑二分图最大匹配,看是否有完美匹配. <_<我们先考虑行变换:对于第 i 行,如果它第 j 位是黑点 ... 
- 1059: [ZJOI2007]矩阵游戏 - BZOJ
		Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ... 
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
		3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ... 
- bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配
		1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1891 Solved: 919[Submit][Statu ... 
- BZOJ 1059 矩阵游戏
		Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个\(N \times N\)黑白方阵进行(如同国际象棋一般,只是颜色是随意的). ... 
- BZOJ 1059 [ZJOI2007]矩阵游戏
		1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2707 Solved: 1322[Submit][Stat ... 
- bzoj 1059 [ZJOI2007]矩阵游戏(完美匹配)
		1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2993 Solved: 1451[Submit][Stat ... 
随机推荐
- Bert文本分类实践(一):实现一个简单的分类模型
			写在前面 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,作者水平有限,只能将平时用到的方法和trick在此做个记录和分享,希 ... 
- C++面向行输入:get()与getline()
			面向行的输入:get()与getline() 引入: char a = 's';//这样的语句合法 char b = "s";//不合法 /* "S"不是字符常 ... 
- 单体应用 适合采用 dapr 构建吗?
			缘起今天在微信群里有同学问 "纯.net 项目,有必要上dapr吗?" 当时不假思索的说不是微服务没必要,其他群友也说没必要.下午细想了一下,觉得这个和微服务没有关系,如果我的应用 ... 
- Head First Python 代码和实例下载
			http://python.itcarlow.ie/resources.html 
- 天脉2(ACoreOS653)操作系统学习01
			天脉2(ACoreOS653)操作系统学习01 由于我的毕业设计涉及相关嵌入式操作系统,故最近学了学天脉2操作系统. 一.ARINC653标准 1.ARINC653标准是什么? ARINC 653 : ... 
- Python绘制Excel图表
			今天讲解下如何使用Python绘制各种Excel图表,下面我们以绘制饼状图.柱状图.水平图.气泡图.2D面积图.3D面积图为例来说明. import openpyxlfrom openpyxl imp ... 
- 并发编程从零开始(八)-ConcurrentHashMap
			并发编程从零开始(八)-ConcurrentHashMap 5.5 ConcurrentHashMap HashMap通常的实现方式是"数组+链表",这种方式被称为"拉链 ... 
- mysql的一些配置操作
			mysql的一些配置操作 一.背景 二.mysql配置 三.慢查询日志 1.命令行临时生效 2.配置文件修改永久生效 3.慢查询日志解释 4.mysqldumpdlow查看慢查询日志 四.查看索引为何 ... 
- Spring Security:简单的保护一个SpringBoot应用程序(总结)
			Spring Security 在 Java类中的配置 在 Spring Security 中使用 Java配置,可以轻松配置 Spring Security 而无需使用 XML . 在Spring ... 
- threading python2 和python3
			from __future__ import division from __future__ import print_function import threading balance = 0 d ... 
