QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#138691 | #5251. Constellations | UNos_maricones# | WA | 5868ms | 3548kb | C++20 | 2.1kb | 2023-08-12 08:19:34 | 2023-08-12 08:19:38 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
typedef long long ll;
typedef pair<ll,ll> ii;
const int N = 2005;
const int mod = 1e9+7;
const ll oo = 1e11;
int sumx[N], sumxs[N], sumy[N], sumys[N], tmm[N], fat[N], sz[N];
int x[N], y[N];
int curr;
void ini (int n) {
for (int i = 0; i < n; ++i) {
fat[i] = i;
sumx[i] = x[i];
sumxs[i] = x[i] * x[i];
sumy[i] = y[i];
sumys[i] = y[i] * y[i];
tmm[i] = i;
sz[i] = 1;
}
curr=n;
}
int fnd(int x) {
if (x == fat[x]) return x;
return fat[x] = fnd(fat[x]);
}
void uni (int x, int y) {
int fx = fnd(x);
int fy = fnd(y);
fat[fx] = fy;
sumx[fy] += sumx[fx];
sumxs[fy] += sumxs[fx];
sumy[fy] += sumy[fx];
sumys[fy] += sumys[fy];
tmm[fy] = curr++;
sz[fy] += sz[fx];
}
int allw[N];
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int n; cin >> n;
for (int i = 0; i < n; ++i) cin >> x[i] >> y[i];
ini(n);
// cout << n << endl;
//return 0;
for (int i = 0; i + 1 < n; ++i) {
int szz = 0;
for (int j = 0; j < n; ++j) {
if (fnd(j) == j) {
allw[szz++] = j;
}
}
pair<ii,ii> best={{oo,1},{-1,-1}};
int tj=-1,tk=-1;
for (int j = 0; j < szz; ++j) {
for (int k = j + 1; k < szz; ++k) {
int rj = allw[j];
int rk = allw[k];
ll cost = 1ll * (sumxs[rj] + sumys[rj]) * sz[rk] + 1ll * (sumxs[rk] + sumys[rk]) * sz[rj] - 2ll * (1ll * sumx[rj] * sumx[rk] + 1ll * sumy[rj] * sumy[rk]);
ii pr = {min(tmm[rj], tmm[rk]),max(tmm[rj],tmm[rk])};
// cout << rj << ' ' << rk << ' ' << cost << endl;
if (1ll * cost * best.ff.ss < 1ll * sz[rk] * sz[rj] * best.ff.ff) {
best = {{cost, 1ll * sz[rk] * sz[rj]},pr};
tj = rj;
tk = rk;
}
if (1ll * cost * best.ff.ss == 1ll*sz[rk] * sz[rj] * best.ff.ff && pr < best.ss) {
best = {{cost, 1ll * sz[rk] * sz[rj]},pr};
tj = rj;
tk = rk;
}
}
}
// cout <<tj<<' ' << tk << endl;
// return 0;
cout << sz[tj] + sz[tk] << '\n';
uni(tj, tk);
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3480kb
input:
2 0 0 1 0
output:
2
result:
ok single line: '2'
Test #2:
score: -100
Wrong Answer
time: 5868ms
memory: 3548kb
input:
2000 1000 -1000 1000 -999 1000 -998 1000 -997 1000 -996 1000 -995 1000 -994 1000 -993 1000 -992 1000 -991 1000 -990 1000 -989 1000 -988 1000 -987 1000 -986 1000 -985 1000 -984 1000 -983 1000 -982 1000 -981 1000 -980 1000 -979 1000 -978 1000 -977 1000 -976 1000 -975 1000 -974 1000 -973 1000 -972 1000...
output:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 10...
result:
wrong answer 2nd lines differ - expected: '2', found: '3'