0
点赞
收藏
分享

微信扫一扫

2021牛客暑期多校训练营3-B(Black and white)

​​原题链接​​

​​过程详解​​

​kruskal​

#include <iostream>
#include <algorithm>
using namespace std;

typedef long long ll;

const int N = 3e7 + 10;
const int M = 5010;

struct Node{
int x, y; // x, y坐标
ll v; // 权值
bool operator < (const Node & u) const { return v < u.v; }
};

Node A[N];
int par[2 * M];
int n, m, a, b, c, d, p;

void init(){
A[0].v = a;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; ++j) {
int id = m * (i - 1) + j; // 二维映射到一位数组中
A[id] = {i, j, ((ll)A[id - 1].v * A[id - 1].v * b + (ll)A[id - 1].v * c + d) % p};
}
}
}

// 并查集
int find(int x){
if(x == par[x]) return x;
return par[x] = find(par[x]);
}

void kruskal(){
// 至少(n - 1) + (m - 1) + 1个点才能将所有行,所有列连接在一起
// 此时剩下的点为free
ll res = 0, cnt = n + m - 1;

// 1~n 表示行,n+1~n+m 表示列
for (int i = 1; i <= n + m; ++i) {
par[i] = i;
}

// 按各点的权值排序
sort(A + 1, A + 1 + m * n);

for (int i = 1; i <= m * n; ++i) {
int x = A[i].x;
int y = A[i].y;
int v = A[i].v;

x = find(x);
y = find(n + y);

if(!cnt) break;

if(x!=y){
par[x] = y;
res += v;
cnt--;
}
}

cout << res << endl;
}

int main(){

cin >> n >> m >> a >> b >> c >> d >> p;

init();
kruskal();

return 0;
}

​prim​

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5000 + 10, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, a, b, c, d, p;
int dis[N * 2], g[N][N];
bool vis[N * 2];

int prim() {
int res = 0;
memset(dis, 0x3f, sizeof dis);
dis[1] = 0;
for (int i = 1; i <= n + m; i++) {
int val = INF, u = 0;
for (int i = 1; i <= n + m; i++) {
if (vis[i]) continue;
if (dis[i] < val) {
val = dis[i];
u = i;
}
}
res += val;
vis[u] = 1;
if (u <= n) {
for (int j = 1; j <= m; j++) {
int v = j + n;
dis[v] = min(dis[v], g[u][j]);
}
} else {
for (int i = 1; i <= n; i++) {
int v = i;
dis[v] = min(dis[v], g[i][u - n]);
}
}
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> a >> b >> c >> d >> p;
ll res = a;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
res = (res * res * b % p + res * c + d) % p;
g[i][j] = res;
}
cout << prim();
return 0;
}


举报

相关推荐

0 条评论