首页 > 其他分享 >题解【P7515 [省选联考 2021 A 卷] 矩阵游戏】

题解【P7515 [省选联考 2021 A 卷] 矩阵游戏】

时间:2022-09-27 18:01:12浏览次数:80  
标签:P7515 int 题解 rep 矩阵 add cdots le 联考

P7515 [省选联考 2021 A 卷] 矩阵游戏
解题报告。
不一定更好的阅读体验


一年前我在省选赛场上折戟沉沙,一年后我从到下的地方再摔一跤。

我成功了,我仍然是以前的那个我。


神题,希望自己讲得清楚一些。

先不考虑 \(0\le a_{i,j}\le 10^6\) 的限制,瞎鸡巴填一手,得到矩阵 \(A\),之后比较自然的想法就是通过 \(+1\) 和 \(-1\) 来微调这个东西。

其实这个时候差不多就可以想到差分约束了,因为我们最终希望把每一个 \(a_{i,j}\) 变成 \(0\le a_{i,j}\le 10^6\) 这样一个范围的形式。不过我知道你很急,但你先别急。继续往下做,看看这个想法有没有希望。

两个比较显然的性质:

  1. 对于每一行轮流进行 \(+1\) 和 \(-1\) 的操作,结果不变。

  2. 对于每一列轮流进行 \(+1\) 和 \(-1\) 的操作,结果不变。

因为任意一个 \(2\times 2\) 的矩阵中的一组 \(+1\) 和 \(-1\) 会相互抵消掉。

我们设 \(1\) 操作在第 \(i\) 行进行了 \(c_{i}\) 次,设 \(2\) 操作在第 \(j\) 行进行了 \(d_i\) 次,那么可以得到如下的矩阵(每一项省略了 \(a_{i,j}\)):

\[\begin{bmatrix} c_1+d_1 & -c_1+d_2 & \cdots & (-1)^{m+1}c_1+d_n\\ c_2-d_1 & -c_2-d_2 & \cdots & (-1)^{m+1}c_2-d_n\\ \cdots & \cdots & \ddots & \cdots\\ c_n+(-1)^{n+1}d_m & -c_n+(-1)^{n+1}d_m & \cdots & (-1)^{m+1}c_n+(-1)^{n+1}d_m \end{bmatrix} \]

第一眼:哇这不是差分约束板子吗!

第二眼:我是不是应该发明一个叫 \(0\le a_{i,j}+c+d\le 10^6\) 的和分约束?

但是这个和分约束显然可以通过变化 \(c\) 的符号来转化成差分约束。

我们将偶数行的 \(c\) 变成相反数,奇数列的 \(d\) 变成相反数。

那么原矩阵就变成了:

\[\begin{bmatrix} c_1-d_1 & d_2-c_1 & \cdots \\ d_1-c_2 & c_2-d_2 & \cdots\\ \cdots & \cdots & \ddots\\ \end{bmatrix} \]

这里仅举例 \(2\times 2\) 的矩阵已经足够证明正确性,因为包含了所有下标的奇偶性。

这样的话转化就做完了。

我们现将第一行 \(a\) 设为 \(0\),然后得到了一个不考虑限制的矩阵 \(A\),之后按照上面的矩阵,以 \((1,1)\) 为例,得到差分约束 \(0\le a_{1,1}+c_1-d_1\le 10^6\) 的形式。

注意,这道题可以不用建立虚点的,因为这张图已经保证联通了,而且是差不多是一张完全图,用链式前向星容易被卡,而 \(\texttt{vector}\) 存图在稠密图的情况下是表现良好的。

个人感觉比较好看的代码:

const int MAXN(310);
const int MAXM(610);
const int MAX(1e6);

int n,m,a[MAXN][MAXN],b[MAXN][MAXN],K;

struct node{int to,cost;};
vector<node>G[MAXM];

bool inq[MAXM];
queue<int>q;
ll d[MAXM];
int cnt[MAXM];

inline void add_edge(int u,int v,int w)
{
	node res;
	res.to=v,res.cost=w;
	G[u].push_back(res);
	return;
}

inline bool spfa(int s)
{
	rep(i,1,n+m) d[i]=LLINF,inq[i]=false,cnt[i]=0;
	d[s]=0;
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		inq[u]=false;
		rep(i,0,(int)G[u].size()-1)
		{
			node e=G[u][i];
			if(d[e.to]>d[u]+e.cost)
			{
				d[e.to]=d[u]+e.cost;
				if(!inq[e.to])
				{
					if(++cnt[e.to]>=n+m) return false;
					inq[e.to]=true,q.push(e.to);
				}
			}
		}
	}
	return true;
}

inline void solve()
{
    n=Fread::read(),m=Fread::read();
    rep(i,1,n-1) rep(j,1,m-1) b[i][j]=Fread::read();
    rev(i,n-1,1) rev(j,m-1,1) a[i][j]=b[i][j]-a[i+1][j]-a[i][j+1]-a[i+1][j+1];//随便构造一个矩阵 A
    rep(i,1,n) rep(j,1,m)
    {
    	if((i+j)&1) add_edge(j+n,i,MAX-a[i][j]),add_edge(i,j+n,a[i][j]);
    	else add_edge(i,j+n,MAX-a[i][j]),add_edge(j+n,i,a[i][j]);
    }
    if(!spfa(1)) puts("NO");
    else
    {
    	puts("YES");
    	rep(i,1,n)
    	{
    		rep(j,1,m) 
    		{
    			int now=d[i]-d[j+n];
    			if((i+j)&1) cout<<a[i][j]+now,putchar('\n');
    			else cout<<a[i][j]-now,putchar('\n');
    		}
    		putchar('\n');
    	}
    }
    Clear(a);
    rep(i,1,n+m) G[i].clear();
    return;
}

int main()
{
	int T=Fread::read();
	while(T--) solve();
	return 0;
}
/*
Date : 2022/9/27
Author : UperFicial
Start coding at : 17:03
finish debugging at : 17:50
*/

标签:P7515,int,题解,rep,矩阵,add,cdots,le,联考
From: https://www.cnblogs.com/UperFicial/p/16735424.html

相关文章

  • 洛谷 CF1257F Make Them Similar 灰 题解
    前言本题解采用折半搜索算法完成,对于不打算用这种方法的同学,这篇题解可能会浪费你人生中宝贵的十几分钟。思路此题似乎找不出什么好的性质,那么考虑暴力。发现\(x,a\)......
  • LG4463 calc 题解
    传送门题意一个序列$a_1,a_2,\dots,a_n$是合法的,当且仅当:$a_1,a_2,\dots,a_n$都是\([1,k]\)中的整数。$a_1,a_2,\dots,a_n$互不相等。一个序列的值定义为它里......
  • P4965 题解
    题目传送门被同机房神犇使用一顿晚饭的时间爆切并当成作业布置给我的题...虽然是紫,但实际难度处于可以接受的范围内。题目分析开始的思路是\(\text{set}\)乱搞,因为发......
  • AtCoder ABC 270 题解(D-F)
    AtCoderABC270题解(D-F)D-Stones(博弈DP)题目:​ 现在有一堆石子,一个序列a表示每次可以从石头里拿走多少个石子。当无法再拿出石头的时候,游戏结束。两边都以最佳策略......
  • 题解【CF1436E Complicated Computations】
    CF1436EComplicatedComputations解题报告。不一定更好的阅读体验。对于一个数\(x\),考虑什么条件\(x\)可以作为答案。首先要满足\(\forally\in[1,x)\),\(y\)......
  • SpringBoot+Mybatis-Plus 数据表字段是关键字的问题解决
    如果字段名是关键字,用mybatisplus时会报以下错误:badSQLgrammar[];nestedexceptionisjava.sql.BatchUpdateException:ORA-01747:user.table.column,table.column......
  • 力扣算法第1题--两数之和(暴力题解&优化题解)
    两数之和题目描述:给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输......
  • P2044 随机数生成器 题解
    这么标准的不动点居然只有一篇不动点题解?而且唯一的不动点题解关于不动点的描述还是错的?所以,来写一篇题解讲讲,MO中是怎么弄这种一阶线性递推式的。单个数,虽然省常数,却......
  • P6835 [Cnoi2020]线形生物 题解
    通过这道题可以看出来pz根本不会期望考虑期望线性性质,设\(E_{x\toy}\)表示从\(x\)走到\(y\)的期望步数,那么有\(E_{1\ton+1}=\sum_{i=1}^nE_{i\toi+1}\),因此考......
  • P2569 [SCOI2010]股票交易 题解
    设\(f_{i,j}\)表示第1天至第\(i\)天,手上有\(j\)股股票时拥有的最多钱。考虑转移,首先就有\(f_{i,j}=-j\timesap_i\)即单纯买入,然后由转移方程定义有\(f_{i,j}=......