[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 ...
随机推荐
- Wireshark简单协议的抓包分析
一.实验目的 HTTP.TCP.UDP.ICMP.ARP.IP.FTP.TELNET查询分析 基本掌握查询命令的使用方法 二.实验环境 硬件环境:一台Windows7系统,一台XP系统 软件环境:VM ...
- 新一代数据科学ide平台DataSpell提前发行版体验
1 简介 PyCharm开发公司jetbrains专门面向数据科学的ide项目DataSpell在前不久发布了其EAP版本(早期预览版本),为我们带来了诸多趋于成熟的功能特性,本文就将为大家介绍其使用 ...
- g++ 常用命令
g++ --help
- python中的信号通信 blinker
信号: 信号是一种通知或者说通信的方式,信号分为发送方和接收方.发送方发送一中信号,接收方收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行.常见的linux中的信号,通过键盘输入Ct ...
- 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树
解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...
- 学了ES6,还不会Promise的链式调用?🧐
前言 本文主要讲解promise的链式调用的方法及其最终方案 应用场景 假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得 ...
- 论文解读丨表格识别模型TableMaster
摘要:在此解决方案中把表格识别分成了四个部分:表格结构序列识别.文字检测.文字识别.单元格和文字框对齐.其中表格结构序列识别用到的模型是基于Master修改的,文字检测模型用到的是PSENet,文字识 ...
- Spring Security 多过滤链的使用
Spring Security 多过滤链的使用 一.背景 二.需求 1.给客户端使用的api 2.给网站使用的api 三.实现方案 方案一: 方案二 四.实现 1.app 端 Spring Secur ...
- CSP-S2021幽寂
不管怎么说,这次比赛考的比这一段时间以来的模拟赛都难看 难受,但是也不想太表现出来,所以更难受.... 有点害怕会退役...... Day -6 前一天晚上回宿舍的时候和\(zxs\)一路,聊的过程中 ...
- Noip模拟41 2021.8.16
T1 你相信引力吗 对于区间的大小关系问题,往往使用单调栈来解决 这道题的优弧和劣弧很烦,考虑将其等价的转化 由于所有的合法情况绕过的弧都不会经过最高的冰锥, 又因为环可以任意亲定起点,这样可以直接把 ...