Black and white(MST)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Black and white(MST)相关的知识,希望对你有一定的参考价值。

Black and white(MST)

思路

考虑对题意中的操作进行分析:

假定这四个数组成的子矩形的左上角是: ( x 1 , y 1 ) \\large (x_1,y_1) (x1,y1)

右下角是: ( x 2 , y 2 ) \\large (x_2,y_2) (x2,y2)

要使得我们能进行该操作,则这两行两列中要有三个位置有数字的。

而位置 ( i , j ) \\large (i,j) (i,j)的数字就是第 i i i行第 j j j列的连通桥梁。

为了更好的表达连通性,不妨人为定义一个顺序(逆时针),我们将点权转化为边权。

这样为了让四个点连通,我们就只需要连三条边。

因此,为了让整个矩阵都涂黑,我们只需要让所有行和所有列连通即可。

因此要用最少的贡献使得所有行列连通,即让该图是一棵树就行了,因此可以采用最小生成树计算。

Code

// Problem: Black and white
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11254/B
// Memory Limit: 1048576 MB
// Time Limit: 4000 ms
// Date: 2021-07-24 12:35:15
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e5+5,M=1e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
int n,m,a,b,c,d,p;
int f[N];
int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}
vector<int>v[N];
int main(){
	scanf("%d%d%d%d%d%d%d",&n,&m,&a,&b,&c,&d,&p);
	a=(a*a*b+a*c+d)%p;
	int tot=n*m;
	for(int i=0;i<tot;i++){
		v[a].pb(i);
		a=(1LL*a*a*b+1LL*a*c+d)%p;
	}
	int ans=0;
	for(int i=0;i<n+m;i++) f[i]=i;
	for(int i=0;i<p;i++){
		for(int w:v[i]){
			int x=w/m,y=w%m;
			x=find(x),y=find(n+y);
			if(x!=y){
				f[x]=y;
				ans+=i; 
			}
		}
	}
	printf("%d\\n",ans);
	return 0;
}

以上是关于Black and white(MST)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5113--Black And White(搜索+剪枝)

HDU 5113 Black And White

搜索(剪枝优化):HDU 5113 Black And White

Off-White x Nike Air VaporMax White and Black Launching in 2018

AtCoder 2376 Black and White Tree

hdu-5583 Kingdom of Black and White(数学,贪心,暴力)