#include <map>
#include <algorithm>
#include <vector>
#include <stdio.h>
#define N 100000
#define MOD 1000000000
#define INF 2147483646
#define min2(x,y) (x<y?x:y)
using namespace std;
int n, tree1_len, tree2_len, tree1_cnt[N], tree2_cnt[N];
long long out;
pair<int,long long> t_save[N];
vector<int> tree1[N], tree2[N];
map<pair<int, int>, int > tree1_NUM, tree2_NUM;
map<pair<int, int>, bool> M, tree1_link, tree2_link;
pair<int, long long> count_tree1(int lev, int up) {
long long cnt = 0, t = 0;
pair<int, long long> temp;
// printf(" IN %d\n ", lev);
for (auto i : tree1[lev])
if (i != up) {
t_save[i] = temp = count_tree1(i, lev);
// out += (long long)temp.first*t, out %= MOD;
t += temp.second, cnt += temp.first;
}
for (auto i : tree1[lev])
if (i != up) {
out += (long long)t_save[i].first*(t-t_save[i].second), out %= MOD;
}
out += (long long)tree1_cnt[lev] * t, out %= MOD;
cnt += (long long)tree1_cnt[lev];
return{ (int)cnt,t + cnt };
}
pair<int, long long> count_tree2(int lev, int up) {
long long cnt = 0, t = 0;
pair<int, long long> temp;
//printf(" IN %d\n ", lev);
for (auto i : tree2[lev])
if (i != up) {
//printf("%d -> %d\n", lev, i);
t_save[i] = temp = count_tree2(i, lev);
// out += (long long)temp.first*t, out %= MOD;
t += temp.second, cnt += temp.first;
}
for (auto i : tree2[lev])
if (i != up) {
//printf("%d -> %d\n", lev, i);
out += (long long)t_save[i].first*(t-t_save[i].second), out %= MOD;
// t += temp.second, cnt += temp.first;
}
out += (long long)tree2_cnt[lev] * t, out %= MOD;
cnt += (long long)tree2_cnt[lev];
return{ (int)cnt,t + cnt };
}
int DistanceSum(int _n, int *X, int *Y) {
n = _n;
int x_min=INF, y_min=INF;
for (int i = 0; i < n; i++) x_min = min2(x_min, X[i]), y_min = min2(y_min, Y[i]);
for (int i = 0; i < n; i++) M[{X[i] - x_min, Y[i] - y_min}] = true;
for (int i = 0; i < n; i++) {
int tx = X[i] - x_min, ty = Y[i] - y_min;
int ttx = tx, tty = ty;
if (!M[{tx, ty - 1}]) {
tree1_len++;
while (M[{tx, ty}]) {
tree1_cnt[tree1_len]++;
tree1_NUM[{tx, ty}] = tree1_len;
ty++;
}
} tx = ttx, ty = tty;
if (!M[{tx - 1, ty}]) {
tree2_len++;
while (M[{tx, ty}]) {
tree2_cnt[tree2_len]++;
tree2_NUM[{tx, ty}] = tree2_len;
tx++;
}
}
}
int x, y;
for (int i = 0; i < n; i++) {
int tx = X[i] - x_min, ty = Y[i] - y_min;
//printf("(%d %d)%d - %d\n", X[i],Y[i],i, tree1_NUM[{tx,ty}]);
x = tree1_NUM[{tx, ty}], y = tree1_NUM[{tx + 1, ty}];
if (M[{tx + 1, ty}] && tree1_link[{x, y}] == false) {
// printf("! %d %d\n",x,y);
tree1_link[{x, y}] = true, tree1_link[{y, x}] = true;
tree1[x].push_back(y), tree1[y].push_back(x);
}
x = tree1_NUM[{tx, ty}], y = tree1_NUM[{tx - 1, ty}];
if (M[{tx - 1, ty}] && tree1_link[{x, y}] == false) {
// printf("! %d %d\n",x,y);
tree1_link[{x, y}] = true, tree1_link[{y, x}] = true;
tree1[x].push_back(y), tree1[y].push_back(x);
}
x = tree2_NUM[{tx, ty}], y = tree2_NUM[{tx, ty + 1}];
if (M[{tx, ty + 1}] && tree2_link[{x, y}] == false) {
tree2_link[{x, y}] = true, tree2_link[{y, x}] = true;
tree2[x].push_back(y), tree2[y].push_back(x);
}
x = tree2_NUM[{tx, ty}], y = tree2_NUM[{tx, ty - 1}];
if (M[{tx, ty - 1}] && tree2_link[{x, y}] == false) {
tree2_link[{x, y}] = true, tree2_link[{y, x}] = true;
tree2[x].push_back(y), tree2[y].push_back(x);
}
}
count_tree1(1, 0), count_tree2(1, 0);
// printf("%d %d ", tree1_len, tree2_len);
return (int)out;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
8352 KB |
Output is correct |
2 |
Correct |
0 ms |
8352 KB |
Output is correct |
3 |
Correct |
0 ms |
8352 KB |
Output is correct |
4 |
Correct |
0 ms |
8352 KB |
Output is correct |
5 |
Correct |
0 ms |
8352 KB |
Output is correct |
6 |
Correct |
0 ms |
8484 KB |
Output is correct |
7 |
Correct |
0 ms |
8352 KB |
Output is correct |
8 |
Correct |
0 ms |
8484 KB |
Output is correct |
9 |
Correct |
0 ms |
8352 KB |
Output is correct |
10 |
Correct |
0 ms |
8352 KB |
Output is correct |
11 |
Correct |
0 ms |
8352 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
8748 KB |
Output is correct |
2 |
Correct |
3 ms |
8748 KB |
Output is correct |
3 |
Correct |
6 ms |
9012 KB |
Output is correct |
4 |
Correct |
6 ms |
8880 KB |
Output is correct |
5 |
Correct |
13 ms |
9276 KB |
Output is correct |
6 |
Correct |
9 ms |
8880 KB |
Output is correct |
7 |
Correct |
16 ms |
9276 KB |
Output is correct |
8 |
Correct |
9 ms |
9012 KB |
Output is correct |
9 |
Correct |
9 ms |
8880 KB |
Output is correct |
10 |
Correct |
6 ms |
8880 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
129 ms |
12456 KB |
Output is correct |
2 |
Correct |
129 ms |
12588 KB |
Output is correct |
3 |
Correct |
449 ms |
18512 KB |
Output is correct |
4 |
Correct |
439 ms |
18644 KB |
Output is correct |
5 |
Execution timed out |
1000 ms |
28408 KB |
Execution timed out |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
256 ms |
17604 KB |
Output is correct |
2 |
Correct |
216 ms |
15540 KB |
Output is correct |
3 |
Correct |
936 ms |
31184 KB |
Output is correct |
4 |
Correct |
856 ms |
26108 KB |
Output is correct |
5 |
Execution timed out |
1000 ms |
50980 KB |
Execution timed out |
6 |
Halted |
0 ms |
0 KB |
- |