#差分约束系统#CodeChef Digit Matrix&洛谷 7515 [省选联考 2021 A 卷] 矩阵游戏
分析
先任意构造出一个不一定满足值域的矩阵,现在只需要满足值域就可以了。
可以发现,给一行或一列依次加一减一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 卷] 矩阵游戏的更多相关文章
- 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)
题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...
- 洛谷 P7520 - [省选联考 2021 A 卷] 支配(支配树)
洛谷题面传送门 真·支配树不 sb 的题. 首先题面已经疯狂暗示咱们建出支配树对吧,那咱就老老实实建呗.由于这题数据范围允许 \(n^2\) 算法通过,因此可以考虑 \(\mathcal O(n^2 ...
- 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)
洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\) \(10^9\) 的时代了吗?落伍了落伍了/ ...
- 洛谷P6623——[省选联考 2020 A 卷] 树
传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...
- 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)
题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...
- [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂
题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...
- 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)
洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...
- 洛谷P3746 [六省联考2017]组合数问题
题目描述 组合数 C_n^mCnm 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数.举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种 ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分
题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...
随机推荐
- UTF-8 的理解
举个简单的例子: Unicode 只是一个业界标准,具体一个字符占多少字节,取决于编码方式,包括 UTF-8 UTF-16 GB2312 等 "汉" 在 UTF-8 中占到 3 个 ...
- python-获得特定程序的屏幕截图并保存为文件
import win32gui import win32ui import win32con name = "test.txt - Notepad" hwnd = win32gui ...
- 【Android逆向】破解看雪9月算法破解第二题
1. apk安装到手机,一样的界面,随便输入一样的报错 2. apk拖入到jadx重看看 public native String sha1(String str); static { System. ...
- go语言中的数据类型
数据类型可分为四类 基础类型 数字.字符串和布尔型 复合类型 数组.结构体 引用类型 指针.切片.map.函数.通道channel 接口类型 interface
- 使用矩池云 Docker 虚拟机安装VNC、Conda、Python及CUDA
矩池云虚拟机支持 Docker 使用,但是由于虚拟机目前不支持启动时传递环境变量来设置VNC.Jupyterlab 连接密码,所以我们没有创建相关基础镜像(设置固定密码容易泄漏),下面给大家介绍手动安 ...
- 【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
问题描述 Azure Event Hub支持 kafka,所以为了测试消息生产者所在环境与Azure Event Hub之间发送消息的性能如何,特别使用 kafka 官方测试生产者,消费者的性能工具 ...
- [Rocky Linux] 使用btrfs
使用btrfs rocky本身并没有btrfs的相关管理工具,所以需要自己安装,但是遗憾的发现它的源中啥也没有.只能考虑自己安装. 相关说明 btrfs Wiki (kernel.org) 可以从中得 ...
- Windows NFS 真弱 → 中文乱码导致文件找不到
开心一刻 正睡着觉,然后来了个电话 对方说:你好,方便面是吗 我愣了一下,以为是恶作剧 回了句:我不是,我是火腿肠! 就挂了电话 又躺了好一会,忽然琢磨过来...... 不对呀,她好像说的是:你好,方 ...
- 基于STM32F407MAC与DP83848实现以太网通讯一(STM32以太网(ETH)外设)
STM32F4xx 可以通过以太网按照 IEEE 802.3-2002 标准发送和接收数据.支持与外部物理层 (PHY) 相连的两个工业标准接口:默认情况下使用的介质独立接口 (MII)(在 IEEE ...
- Swagger (API框架,API 文档 与API 定义同步更新)
1.依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...