# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
39112 |
2018-01-09T11:03:34 Z |
14kg |
Ideal city (IOI12_city) |
C++11 |
|
33 ms |
30672 KB |
#include <map>
#include <algorithm>
#include <vector>
#include <stdio.h>
#include <set>
#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];
set<int> tree1[N], tree2[N];
map<int, int > tree1_NUM[N], tree2_NUM[N];
map<int, bool> M[N];
pair<int, long long> count_tree1(int lev, int up) {
long long cnt = 0, t = 0;
pair<int, long long> temp;
for (auto i : tree1[lev])
if (i != up) {
t_save[i] = temp = count_tree1(i, lev);
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;
for (auto i : tree2[lev])
if (i != up) {
t_save[i] = temp = count_tree2(i, lev);
t += temp.second, cnt += temp.first;
}
for (auto i : tree2[lev])
if (i != up) out += (long long)t_save[i].first*(t-t_save[i].second), out %= MOD;
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;
x = tree1_NUM[tx][ty], y = tree1_NUM[tx + 1][ty];
if (y) {
tree1[x].insert(y), tree1[y].insert(x);
}
x = tree1_NUM[tx][ty], y = tree1_NUM[tx - 1][ty];
if (y) {
tree1[x].insert(y), tree1[y].insert(x);
}
x = tree2_NUM[tx][ty], y = tree2_NUM[tx][ty + 1];
if (y) {
tree2[x].insert(y), tree2[y].insert(x);
}
x = tree2_NUM[tx][ty], y = tree2_NUM[tx][ty - 1];
if (y) {
tree2[x].insert(y), tree2[y].insert(x);
}
}
count_tree1(1, 0), count_tree2(1, 0);
return (int)out;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
0 ms |
27096 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
0 ms |
27228 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
16 ms |
28296 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
33 ms |
30672 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |