#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
struct Edge {
i64 u, v, d;
};
i64 par[10005];
i64 find(i64 x) {
if (x == par[x])
return x;
return par[x] = find(par[x]);
}
void merge(i64 x, i64 y) {
x = find(x);
y = find(y);
par[x] = y;
}
int main(){
i64 n, a, b, c, d;
scanf("%lld %lld %lld %lld %lld", &n, &a, &b, &c, &d);
vector<i64> x(n + 5);
for (int i = 1; i <= n; i++) {
scanf("%lld", &x[i]);
par[i] = i;
}
vector<Edge> edge;
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
Edge e;
e.u = i;
e.v = j;
e.d = ((x[i]*a + x[j]*b)%c)^d;
edge.push_back(e);
}
}
sort(all(edge), [](const Edge& l, const Edge& r) {
return l.d < r.d;
});
i64 used = 0;
i64 ans = 0;
for (auto &e: edge) {
if (find(e.u) == find(e.v))
continue;
used++;
ans += e.d;
merge(e.u, e.v);
}
if (used != n - 1) {
printf("-1\n");
return 0;
}
printf("%lld\n", ans);
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
struct Edge {
i64 u, v, d;
bool operator < (const Edge& o) const {
return d > o.d;
}
};
i64 par[10005];
i64 find(i64 x) {
if (x == par[x])
return x;
return par[x] = find(par[x]);
}
void merge(i64 x, i64 y) {
x = find(x);
y = find(y);
par[x] = y;
}
int main(){
i64 n, a, b, c, d;
scanf("%lld %lld %lld %lld %lld", &n, &a, &b, &c, &d);
vector<i64> x(n + 5);
for (int i = 1; i <= n; i++) {
scanf("%lld", &x[i]);
par[i] = i;
}
priority_queue<Edge> pq;
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
Edge e;
e.u = i;
e.v = j;
e.d = ((x[i]*a + x[j]*b)%c)^d;
pq.push(e);
}
}
i64 used = 0;
i64 ans = 0;
while(!pq.empty()) {
if (used == n - 1)
break;
Edge cur = pq.top();
pq.pop();
if (find(cur.u) == find(cur.v))
continue;
used++;
ans += cur.d;
merge(cur.u, cur.v);
}
printf("%lld\n", ans);
return 0;
}
'백준' 카테고리의 다른 글
24778 Cracking The Safe (0) | 2022.07.30 |
---|---|
9367 관리 난항 (0) | 2022.07.23 |
16493 최대 페이지 수 (0) | 2022.07.09 |
14621 나만 안되는 연애 (0) | 2022.07.09 |
4095 최대 정사각형 (0) | 2022.07.02 |