当前位置: 首页 > news >正文

P7515 [省选联考 2021 A 卷] 矩阵游戏

P7515 [省选联考 2021 A 卷] 矩阵游戏

大意

给出 \(b_{i, j} = a_{i - 1, j} + a_{i, j - 1} + a_{i - 1, j - 1} + a_{i, j}\),要求给出一组 \(a\) 的可行解,保证 \(0 \le a_{i, j} \le 10 ^ 6\)

思路

这集真的神了。

我们想一个问题,首先这个题我们很容易构造出一个 \(a\),使其满足 \(b\) 的性质,我们将 \(a_{i, 1}\)\(a_{1, i}\) 都设为 \(0\),那么我们有这样的转移式子:\(a_{i, j} = b_{i - 1, j - 1} - a_{i - 1, j} - a_{i, j - 1} - a_{i - 1, j - 1}\),这样构造出来的 \(a\) 是含有负数的,但是我们考虑进行调整。

这里有一个小巧思,我们考虑对于每一行和每一列进行增量的操作,加减交替,这样会得到以下这个样子的矩阵:

\[\begin{pmatrix} r_1 + c_1 & -r_1 + c_2 & r_1 + c_3 & \cdots \\ r_2 - c_1 & -r_2 - c_2 & r_2 - c_3 & \cdots \\ r_3 + c_1 & -r_3 + c_2 & r_3 + c_3 & \cdots \\ \vdots & \vdots & \vdots & \ddots \end{pmatrix}\]

有什么用呢???我们发现 \((r_1 + c_1) + (-r_1 + c_2) + (r_2 - c_1) + (-r_2 - c_2) = 0\),那么这样我们就在不改变 \(b\) 的情况下可以对 \(a\) 进行调整,那么会变成类似于这样的差分约束系统:\(0 \le a_{i, j} \pm r_i \pm c_i \le 10 ^ 6\),我们就直接对这样的建立差分约束系统,然后跑 SPFA 即可(注意判负环,如果有负环说明就没有答案)

代码

#include<iostream>
#include<vector>
#include<queue>
using namespace std;const int MAXN = 1005;
const int INF = 1000000;
int T;
int n, m;
int b[MAXN][MAXN];
int a[MAXN][MAXN];
vector<pair<int, int> > g[MAXN];
bool vis[MAXN << 1];
int dis[MAXN << 1], in[MAXN << 1];
queue<int> q;void init(){while(!q.empty()) q.pop();for(int i = 1;i <= n + m;i ++){dis[i] = 0;vis[i] = 1;in[i] = 0;q.push(i);}
}void solve(){cin >> n >> m;for(int i = 1;i < n;i ++){for(int j = 1;j < m;j ++){cin >> b[i][j];}}for(int i = 1;i <= n;i ++)for(int j = 1;j <= m;j ++)a[i][j] = 0;for(int i = 2;i <= n;i ++){for(int j = 2;j <= m;j ++){a[i][j] = b[i - 1][j - 1] - a[i - 1][j] - a[i][j - 1] - a[i - 1][j - 1];
//            cout << a[i][j] << ' ';}
//        cout << endl;}for(int i = 1;i <= n + m + 1;i ++) g[i].clear();for(int i = 1;i <= n;i ++){for(int j = 1;j <= m;j ++){if((i + j) & 1){g[i].push_back(make_pair(j + n, a[i][j]));g[j + n].push_back(make_pair(i, INF - a[i][j]));}else{g[j + n].push_back(make_pair(i, a[i][j]));g[i].push_back(make_pair(j + n, INF - a[i][j]));}}}init();while(!q.empty()){int u = q.front(); q.pop(); vis[u] = 0;for(auto x : g[u]){int v = x.first, w = x.second;if(dis[u] + w < dis[v]){dis[v] = dis[u] + w;if(!vis[v]){in[v] ++;if(in[v] > n + m + 1){cout << "NO\n";return;}vis[v] = 1;q.push(v);}}}}bool flag = 1;
//    cout << "YES\n";for(int i = 1;i <= n;i ++){for(int j = 1;j <= m;j ++){if((i + j) & 1) a[i][j] += (dis[i] - dis[j + n]);else a[i][j] += (dis[j + n] - dis[i]);if(a[i][j] < 0) flag = 0;
//            cout << a[i][j] << ' ';}
//        cout << '\n';}if(flag){cout << "YES\n";for(int i = 1;i <= n;i ++){for(int j = 1;j <= m;j ++){cout << a[i][j] << ' ';}cout << '\n';}}else cout << "NO\n";
}int main(){// freopen("matrix.in", "r", stdin);// freopen("matrix.out", "w", stdout);cin.tie(0) -> ios::sync_with_stdio(0);cin >> T;while(T --){solve();}return 0;
}
http://www.jsqmd.com/news/409211/

相关文章:

  • 振石股份在西班牙建风电叶片材料基地,欧洲供应链为何需要它
  • 经典不等式自查
  • 2026最新云南旅游公司品牌top10推荐!云南/本地优质旅游服务商权威榜单发布,实力品牌助力舒心出行 - 十大品牌榜
  • 【报告】西班牙基地的30个月与2.499亿元 振石股份把产能放到欧洲风电供应链周围
  • 2026年广州名表维修推荐评测与排名榜单:当名表需要保养时如何选择可靠服务网点 - 品牌推荐
  • 端到端十年演进
  • 2026年广州名士表手表维修评测推荐:非官方维修点选择指南与网点服务深度分析 - 品牌推荐
  • 编程技能的普及化与社会影响
  • AI时代,AI Agent是什么?
  • 手把手搭建 Adaptive RAG 系统:从向量检索到 Streamlit 前端全流程
  • 爬虫助手|视频批量下载分享
  • 2026年广州美度手表维修推荐评测:非官方维修点排行榜与售后网点选择指南 - 品牌推荐
  • LuckPerms 安装 Paper生存服配置权限组
  • 微信小程序的鲜花商城 鲜花销售私信聊天的设计与实现
  • 2026年广州名士表手表维修评测推荐:非官方维修点选择指南与网点服务深度排名 - 品牌推荐
  • 2026年广州美度手表维修推荐榜单:非官方维修网点服务评测与选择指南 - 品牌推荐
  • 【Kafka进阶篇】Kafka延迟请求处理核心:时间轮算法拆解,比DelayQueue高效10倍
  • 多城高薪机会!大模型 AI 训练师岗位清单:含薪资范围 + 任职要求,总有一款适合你
  • 2026最新云南旅行社品牌top10推荐!本地优质服务商权威榜单发布,覆盖昆明/云南全境出行需求 - 十大品牌榜
  • 2026年广州美度手表维修推荐评测:非官方维修点榜单与售后网点服务指南 - 品牌推荐
  • 2026年广州名表维修推荐评测与排名:当高端腕表遭遇保养难题时如何选择可靠服务网点 - 品牌推荐
  • 2026年广州罗杰杜彼手表维修推荐评测:非官方维修网点服务与售后中心选择指南 - 品牌推荐
  • 从零开始构建RAG问答系统:让大模型基于你的知识库回答问题(收藏版)
  • 2026年广州名表维修推荐评测与排名:非官方维修点选择避坑指南 - 品牌推荐
  • 2026年广州罗杰杜彼手表维修网点推荐评测:非官方维修中心的服务与售后深度分析 - 品牌推荐
  • 微信小程序的社区论坛与二手交易平台的设计与实现
  • 大数据领域数据科学的质量控制与评估
  • Windows下编译OpenSCAD
  • AI Agent自主权调节:从全自主到全手动,找到最佳平衡点(收藏必备)
  • 微信小程序的智能医疗就诊排号管理系统设计与实现