洛谷传送门

DGMATRIX


分析

先任意构造出一个不一定满足值域的矩阵,现在只需要满足值域就可以了。

可以发现,给一行或一列依次加一减一2*2矩阵的和仍然不变,并且如果有解一定能构造出一组方案。

因为第一行和第一列如果确定,所以只要通过这样的加一减一,其它位置就能确定。

设行的选择为 \(dx[i]\),列的选择为 \(dy[j]\),那么就要满足 \(0\leq a[i][j]+dx[i]+dy[j]\leq 10^6\)

可是这样的加法好像也挺难做的,能不能强制让一个为加,一个为减,这是可行的,将矩阵黑白染色。

如果 \(i\) 和 \(j\) 奇偶性不同,那么 \(dy[j]-dx[i]\leq M-a[i][j],dx[i]-dy[j]\leq a[i][j]\),

同奇同偶的情况正好将 \(dx[i]\) 和 \(dy[j]\) 调换即可,跑一遍最短路如果有负环那么无解,否则同样按照奇偶性输出方案即可。


代码(矩阵游戏)

#include <cstdio>
#include <cctype>
#include <deque>
#define rr register
using namespace std;
const int N=301,M=1000000; deque<int>q;
struct node{int y,w,next;}e[N*N<<1]; long long dis[N<<1];
int cnt[N<<1],et,as[N<<1],v[N<<1],a[N][N],n,m,flag;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void add(int x,int y,int w){
e[++et]=(node){y,w,as[x]},as[x]=et;
}
signed main(){
for (rr int T=iut();T;--T){
n=iut(),m=iut(),et=0;
for (rr int i=1;i<=n+m;++i) dis[i]=1e15;
for (rr int i=1;i<=n+m;++i) as[i]=cnt[i]=v[i]=0;
for (rr int i=1;i<n;++i)
for (rr int j=1;j<m;++j) a[i][j]=iut();
for (rr int i=n-1;i;--i)
for (rr int j=m-1;j;--j)
a[i][j]-=a[i+1][j]+a[i][j+1]+a[i+1][j+1];
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j)
if ((i+j)&1) add(i,j+n,M-a[i][j]),add(j+n,i,a[i][j]);
else add(i,j+n,a[i][j]),add(j+n,i,M-a[i][j]);
while (!q.empty()) q.pop_back();
q.push_back(1),dis[1]=0,v[1]=flag=1;
while (!q.empty()&&flag){
rr int x=q.front(); q.pop_front();
if (++cnt[x]==n+m) {flag=0; break;}
for (rr int i=as[x];i;i=e[i].next)
if (dis[e[i].y]>dis[x]+e[i].w){
dis[e[i].y]=dis[x]+e[i].w;
if (!v[e[i].y]){
v[e[i].y]=1;
if (!q.empty()&&dis[e[i].y]<dis[q.front()])
q.push_front(e[i].y);
else q.push_back(e[i].y);
}
}
v[x]=0;
}
if (!flag) printf("NO\n");
else{
printf("YES\n");
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j){
if ((i+j)&1) print(a[i][j]-dis[i]+dis[j+n]);
else print(a[i][j]+dis[i]-dis[j+n]);
putchar(j==m?10:32);
}
}
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=m;++j) a[i][j]=0;
}
return 0;
}

代码(DGMATRIX)

#include <cstdio>
#include <cctype>
#include <deque>
using namespace std;
const int N=111,M=9; deque<int>q;
struct node{int y,w,next;}e[N*N<<1];
int et,as[N<<1],v[N<<1],dis[N<<1],a[N][N],n,m;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void add(int x,int y,int w){
e[++et]=(node){y,w,as[x]},as[x]=et;
}
int main(){
n=iut()+1;
for (int i=1;i<=n*2;++i) dis[i]=0x3f3f3f3f;
for (int i=1;i<n;++i)
for (int j=1;j<n;++j) a[i][j]=iut();
for (int i=n-1;i;--i) for (int j=n-1;j;--j)
a[i][j]-=a[i+1][j]+a[i][j+1]+a[i+1][j+1];
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if ((i+j)&1) add(i,j+n,M-a[i][j]),add(j+n,i,a[i][j]);
else add(i,j+n,a[i][j]),add(j+n,i,M-a[i][j]);
q.push_back(1),dis[1]=0,v[1]=1;
while (!q.empty()){
int x=q.front(); q.pop_front();
for (int i=as[x];i;i=e[i].next)
if (dis[e[i].y]>dis[x]+e[i].w){
dis[e[i].y]=dis[x]+e[i].w;
if (!v[e[i].y]){
v[e[i].y]=1;
if (!q.empty()&&dis[e[i].y]<dis[q.front()])
q.push_front(e[i].y);
else q.push_back(e[i].y);
}
}
v[x]=0;
}
for (int i=1;i<=n;++i){
for (int j=1;j<=n;++j)
if ((i+j)&1) putchar(48+a[i][j]-dis[i]+dis[j+n]);
else putchar(48+a[i][j]+dis[i]-dis[j+n]);
putchar(10);
}
return 0;
}

#差分约束系统#CodeChef Digit Matrix&洛谷 7515 [省选联考 2021 A 卷] 矩阵游戏的更多相关文章

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

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

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

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

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

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

  4. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

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

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

  6. [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂

    题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...

  7. 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)

    洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...

  8. 洛谷P3746 [六省联考2017]组合数问题

    题目描述 组合数 C_n^mCnm​ 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数.举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种 ...

  9. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

  10. 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分

    题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...

随机推荐

  1. win32 - 在cmd中禁用进程权限

    C:\Users\path>whoami /priv 在cmd中输入whoami /priv后将获得当前令牌(标准用户)的权限. C:\Users\path>tasklist /v /fo ...

  2. 【LeetCode贪心#04】跳跃游戏I + II

    跳跃游戏 力扣题目链接(opens new window) 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示 ...

  3. 浅谈 rxgo 在项目中的使用方式

    项目中使用到了 RxGo ,感觉现有的处理方式有一定的优势,当然也有一定的有劣势,遂记录下来,免得自己忘记. 本文介绍的只是 rxgo 的一种方式而已,如果你有不错的使用方式,请不吝赐教,谢谢. 对 ...

  4. 【Azure Function App】Java Function在运行中遇见内存不足的错误

    问题描述 在Function的Code+Test界面进行函数触发可以成功.因为Function为Blob Trigger,当在Blob容器下上传文件后,Function可以被正常触发但是报 outof ...

  5. vscodeC++生成配置文件

    参考 https://www.cnblogs.com/harrypotterisdead/p/14207866.html 和 https://www.cnblogs.com/heyiping/p/14 ...

  6. 【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本

    前言 缘由 Iphone15来了,两年之约你还记得吗? 遂整合之前iphone13及iphone14的相关抢购代码,完成一个SpringBoot监听Iphone15有货邮件提醒+python自动化脚本 ...

  7. Java 在三个数字中找出最大值

    1 int aa1 = 11000000; 2 int aa2 = 20000; 3 int aa3 = 6000; 4 5 //第一种 6 int max = (aa1 > aa2)? aa1 ...

  8. 字典嵌套列表 与 列表嵌套字典 导出为csv 的方法

    字典嵌套列表 导出csv {'rank': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '1 ...

  9. 微软应用商店错误代码“0x80131500”怎么修复?

    处理方法一 打开"运行"输入 inetcpl.cpl ("WINDOWS"+"R"键,输入 inetcpl.cpl亦可),点开高级往下拉,勾 ...

  10. 关于Chrome版本太旧的更新问题

    •问题 这两天不知道咋了,Chrome 老是给我提示版本太旧,需要更新. 作为一名资深的强迫症患者,这让我很是不爽. •解决方案 在桌面找到 Chrome 图标,右击选择[属性],在该位置添加如下语句 ...