很巧妙的一个构造。

我是没有想到的。

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

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

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

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

借用一下其他大佬的图。

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

[省选联考 2021 A 卷] 矩阵游戏
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ll long long
  5. ll N;
  6. int n,m;
  7. int a[4000][4000],b[4000][4000],cnt,head[100000];
  8. ll dis[100000];
  9. struct P{int s,to,next,v;}e[400000];
  10. inline void clear(){cnt = 0;std::memset(head,0,sizeof(head));std::memset(dis,0x3f,sizeof(dis));}
  11. inline void add(ll x,ll y,ll v){
  12. // std::cout<<x<<" "<<y<<" "<<v<<std::endl;
  13. e[++cnt].s = x;
  14. e[cnt].to = y;
  15. e[cnt].next = head[x];
  16. e[cnt].v = v;
  17. head[x] = cnt;
  18. }
  19. inline int read(){
  20. int ans = 0;
  21. char a = getchar();
  22. while(a < '0' || a > '9')a = getchar();
  23. while(a <= '9' && a >= '0')
  24. ans = (ans << 3) + (ans << 1) + (a - '0'),a = getchar();
  25. return ans;
  26. }
  27. inline void init(){
  28. n = read(),m = read();
  29. for(int i = 1;i <= n - 1;++i)
  30. for(int j = 1;j <= m - 1;++j)
  31. b[i][j] = read();
  32. }
  33. inline void st(){
  34. for(int i = n;i >= 1;--i)
  35. for(int j = m;j >= 1;--j)
  36. a[i][j] = b[i][j] - a[i + 1][j] - a[i + 1][j + 1] - a[i][j + 1];
  37. }
  38. inline bool r(){
  39. dis[1] = 0;
  40. for(int i = 1;i <= n;++i){
  41. for(int j = 1;j <= cnt;++j){
  42. int s = e[j].s;
  43. int t = e[j].to;
  44. if(dis[t] > dis[s] + e[j].v)
  45. dis[t] = dis[s] + e[j].v;
  46. // std::cout<<s<<" "<<t<<" "<<dis[t]<<" "<<dis[s]<<" "<<e[j].v<<std::endl;
  47. }
  48. }
  49. // for(int i = 1;i <= m + n;++i)
  50. // std::cout<<dis[i]<<" ";
  51. for(int j = 1;j <= cnt;++j){
  52. int s = e[j].s;
  53. int t = e[j].to;
  54. if(dis[t] > dis[s] + e[j].v){
  55. return false;
  56. }
  57. }
  58. return true;
  59. }
  60. inline void putout(){
  61. // for(int i = 1;i <= m + n;++i)
  62. // std::cout<<dis[i]<<" ";
  63. puts("YES");
  64. // for(int i = 1;i <= n;++i,puts(""))
  65. // for(int j = 1;j <= m;++j)
  66. // std::cout<<a[i][j]<<" ";
  67. for(int i = 1;i <= n;++i,puts(""))
  68. for(int j = 1;j <= m;++j){
  69. if(!((i + j) & 1))
  70. a[i][j] = a[i][j] + dis[i] - dis[n + j];
  71. else
  72. a[i][j] = a[i][j] + dis[j + n] - dis[i];
  73. std::cout<<a[i][j]<<" ";
  74. }
  75. }
  76. inline void got(){
  77. clear();
  78. for(int i = 1;i <= n;++i){
  79. for(int j = 1;j <= m;++j){
  80. if(!((i + j) & 1))
  81. add(i,j + n,a[i][j]),add(j + n,i,1000000 - a[i][j]);
  82. else
  83. add(j + n,i,a[i][j]),add(i,j + n,1000000 - a[i][j]);
  84. }
  85. }
  86. // for(int i = 1;i <= m + n;++i)
  87. // add(0,i,0);
  88. if(!r())
  89. puts("NO");
  90. else
  91. putout();
  92. }
  93. int main(){
  94. scanf("%d",&N);
  95. while(N -- ){
  96. init();
  97. st();
  98. got();
  99. }
  100. }

[省选联考 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. 虚拟机Parallels Desktop 17 (PD17)支持M1 自己动手制作启动器解锁

    个人博客:xzajyjs.cn 如果自己有能力的话,直接查看这个视频即可.点此 前段时间刚出pd17,作为mac上最最强(没有之一)的虚拟机,版本17更是更进一步,性能提升极大,更是支持了Monter ...

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

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

  3. AIbee 笔试

    CSS选择器 div+p 选择紧接在div元素之后的所有< p >元素 C++删除数组最后一个元素. 例如[1 2 3 4] 最后变为 [1 2 3] 用splice的删除,增加和替换 a ...

  4. 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题

    该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...

  5. 【Java虚拟机10】ClassLoader.getSystemClassLoader()流程简析

    前言 学习类加载必然离开不了sun.misc.Launcher这个类和Class.forName()这个方法. 分析ClassLoader.getSystemClassLoader()这个流程可以明白 ...

  6. 【c++ Prime 学习笔记】第3章 字符串、向量和数组

    string和vector是两类最重要的标准库类型 strng表示可变长的字符序列 vector存放某种给定类型对象的可变长序列. 3.1 命名空间的using声明 using namespace:: ...

  7. 这样调优之后,单机也能扛下100W连接

    1 模拟单机连接瓶颈 我们知道,通常启动一个服务端会绑定一个端口,例如8000端口,当然客户端连接端口是有限制的,除去最大端口65535和默认的1024端口及以下的端口,就只剩下1 024~65 53 ...

  8. 第七次Scrum Metting

    日期:2021年5月5日 会议主要内容概述:前后端对接,以及接下来的测试优化等工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 测试数据模块和 ...

  9. fatal error: sqlite3.h: No such file or directory

    编译带有sqlite3的数据库c语言程序时,出现fatal error: sqlite3.h: No such file or directory,找不到头文件的问题.应该是是系统没有安装函数库. 在 ...

  10. 第10课 OpenGL 3D世界

    加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelge ...