Submission #121889

#TimeUsernameProblemLanguageResultExecution timeMemory
121889TuGSGeReLIdeal city (IOI12_city)C++14
55 / 100
276 ms32456 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define ll long long #define mp make_pair #define pub push_back #define pob pop_back() #define ss second #define ff first #define mt make_tuple #define pof pop_front() #define fbo find_by_order #define ook order_of_key #define lb lower_bound #define ub upper_bound #define inbuf_len 1 << 16 #define outbuf_len 1 << 16 typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set; using pll = pair <ll, ll>; using pii = pair <int, int>; ll cx[100001], cy[100001], mod = 1e9, dist[2001][2001], grd[2002][2002], h[4] = {0, 0, -1, 1}, v[4] = {-1, 1, 0, 0}, ans, used[2001]; int DistanceSum(int n, int *x, int *y) { int mnx = INT_MAX, mny = INT_MAX; for (int i = 0; i < n; i++) { mnx = min(mnx, x[i]); mny = min(mny, y[i]); } for (int i = 0; i < n; i++) { x[i] -= mnx; y[i] -= mny; } if ( n <= 2000 ) { for (int i = 0; i < n; i++) grd[x[i]][y[i]] = i + 1; memset(dist, -1, sizeof dist); for (int i = 0; i < n; i++) { queue<pii> q; q.push(mp(x[i], y[i])); dist[i + 1][i + 1] = 0; memset(used, 0, sizeof used); used[i + 1] = 1; while (!q.empty()) { int u = q.front().ff, ve = q.front().ss; q.pop(); for (int j = 0; j < 4; j++) { if ( u + v[j] >= 0 && ve + h[j] >= 0 && grd[u + v[j]][ve + h[j]] && !used[grd[u + v[j]][ve + h[j]]] ) { used[grd[u + v[j]][ve + h[j]]] = 1; dist[i + 1][grd[u + v[j]][ve + h[j]]] = dist[i + 1][grd[u][ve]] + 1; q.push(mp(u + v[j], ve + h[j])); } } } for (int j = i + 1; j < n; j++) { ans = (ans + dist[i + 1][j + 1]) % mod; } } } else { for (int i = 0; i < n; i++) { cx[x[i]]++; cy[y[i]]++; } ll sx = 0, sy = 0, ssx = 0, ssy = 0; for (int i = n; i >= 0; i--) { ans = (ans + ((ssx * cx[i]) % mod + (cy[i] * ssy) % mod) % mod) % mod; sy = (sy + cy[i]) % mod; sx = (sx + cx[i]) % mod; ssx = (ssx + sx) % mod; ssy = (ssy + sy) % mod; } } return ans; } // //int main() { // int tmp; // // int N, i; // scanf("%d", &N); // // int sq_x[100001], sq_y[100001]; // for (i = 0; i < N; i++) { // tmp = scanf("%d %d", &sq_x[i], &sq_y[i]); // } // // int ds = DistanceSum(N, sq_x, sq_y); // printf("%d\n", ds); // // return 0; // //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...