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
Off-White x Nike Air VaporMax White and Black Launching in 2018