很巧妙的一个构造。

我是没有想到的。

自己的思维能力可能还是不足。

考虑先满足\(b\)对\(a\)的限制,把\(a\)的第一行和第一列设\(0\),推出这个\(a\)。

接下来考虑对这个\(a\),矩阵进行一些行列加的操作满足\(\leq 1e6\)的性质。

考虑操作做时,奇偶分开加减这样的操作保证\(b\)的限制。

借用一下其他大佬的图。

如下代码因为被卡常了,所以在跑\(BellmanFord\)时没有跑完,所以其实并不保证正确性。只是能过数据而已,好无奈。

[省选联考 2021 A 卷] 矩阵游戏
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long ll N;
int n,m;
int a[4000][4000],b[4000][4000],cnt,head[100000];
ll dis[100000]; struct P{int s,to,next,v;}e[400000]; inline void clear(){cnt = 0;std::memset(head,0,sizeof(head));std::memset(dis,0x3f,sizeof(dis));} inline void add(ll x,ll y,ll v){
// std::cout<<x<<" "<<y<<" "<<v<<std::endl;
e[++cnt].s = x;
e[cnt].to = y;
e[cnt].next = head[x];
e[cnt].v = v;
head[x] = cnt;
} inline int read(){
int ans = 0;
char a = getchar();
while(a < '0' || a > '9')a = getchar();
while(a <= '9' && a >= '0')
ans = (ans << 3) + (ans << 1) + (a - '0'),a = getchar();
return ans;
} inline void init(){
n = read(),m = read();
for(int i = 1;i <= n - 1;++i)
for(int j = 1;j <= m - 1;++j)
b[i][j] = read();
} inline void st(){
for(int i = n;i >= 1;--i)
for(int j = m;j >= 1;--j)
a[i][j] = b[i][j] - a[i + 1][j] - a[i + 1][j + 1] - a[i][j + 1];
} inline bool r(){
dis[1] = 0;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= cnt;++j){
int s = e[j].s;
int t = e[j].to;
if(dis[t] > dis[s] + e[j].v)
dis[t] = dis[s] + e[j].v;
// std::cout<<s<<" "<<t<<" "<<dis[t]<<" "<<dis[s]<<" "<<e[j].v<<std::endl;
}
}
// for(int i = 1;i <= m + n;++i)
// std::cout<<dis[i]<<" ";
for(int j = 1;j <= cnt;++j){
int s = e[j].s;
int t = e[j].to;
if(dis[t] > dis[s] + e[j].v){
return false;
}
}
return true;
} inline void putout(){
// for(int i = 1;i <= m + n;++i)
// std::cout<<dis[i]<<" ";
puts("YES");
// for(int i = 1;i <= n;++i,puts(""))
// for(int j = 1;j <= m;++j)
// std::cout<<a[i][j]<<" ";
for(int i = 1;i <= n;++i,puts(""))
for(int j = 1;j <= m;++j){
if(!((i + j) & 1))
a[i][j] = a[i][j] + dis[i] - dis[n + j];
else
a[i][j] = a[i][j] + dis[j + n] - dis[i];
std::cout<<a[i][j]<<" ";
}
} inline void got(){
clear();
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
if(!((i + j) & 1))
add(i,j + n,a[i][j]),add(j + n,i,1000000 - a[i][j]);
else
add(j + n,i,a[i][j]),add(i,j + n,1000000 - a[i][j]);
}
}
// for(int i = 1;i <= m + n;++i)
// add(0,i,0);
if(!r())
puts("NO");
else
putout();
} int main(){
scanf("%d",&N);
while(N -- ){
init();
st();
got();
}
}

[省选联考 2021 A 卷] 矩阵游戏的更多相关文章

  1. 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)

    题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...

  2. 洛谷 P7520 - [省选联考 2021 A 卷] 支配(支配树)

    洛谷题面传送门 真·支配树不 sb 的题. 首先题面已经疯狂暗示咱们建出支配树对吧,那咱就老老实实建呗.由于这题数据范围允许 \(n^2\)​ 算法通过,因此可以考虑 \(\mathcal O(n^2 ...

  3. [省选联考 2021 A/B 卷] 卡牌游戏

    垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...

  4. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  5. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  6. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  7. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  8. 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)

    题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...

  9. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

随机推荐

  1. DL4J实战之五:矩阵操作基本功

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. 这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?

    大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...

  3. [no_code][Alpha]发布声明报告

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 发布声明 我们在这个课程的目标是 设计出一个OCR表单处理软件 这个作业在哪个具体方面 ...

  4. 力扣 - 剑指 Offer 57. 和为s的两个数字

    题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...

  5. Noip模拟20 2021.7.19

    T1 玩具 题目读错意思直接报零... 拼接方式没读懂以为是个数学题,用卡特兰数,可是的确想多了 数据范围表达出你怎么暴力都行,选择$n^3,dp$ 相当于一片森林,每次多加一条边就合并成一棵树 在$ ...

  6. Linux C语言多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

  7. 检查是否是BST 牛客网 程序员面试金典 C++ java Python

    检查是否是BST 牛客网 程序员面试金典  C++ java Python 题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个boo ...

  8. hdu 5102 The K-th Distance (队列+生成法,,)

    题意: N个点的一棵树.定义点u和点v的距离等于它们之间的路径(唯一的)的长度.这样我们可以得到n*(n-1)/2个距离. 将它们从小到大排序,问前K个数的和是多少. 思路: 将边长为1的树枝都入队列 ...

  9. 第01课 OpenGL窗口(3)

    接下来的代码段创建我们的OpenGL窗口.我花了很多时间来做决定是否创建固定的全屏模式这样不需要许多额外的代码,还是创建一个容易定制的友好的窗口但需要更多的代码.当然最后我选择了后者.我经常在EMai ...

  10. x64 InlineHook 黑魔法

    目录 x64 InlineHook 黑魔法 为什么不能用X86 的HOOK方式? 原理:jmp + rip 进行寻址6字节方式跳转 手动InlineHook 临时地址x(找一块空内存) 计算偏移 源地 ...