Submission #39112

#TimeUsernameProblemLanguageResultExecution timeMemory
3911214kgIdeal city (IOI12_city)C++11
0 / 100
33 ms30672 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...