Submission #1168713

#TimeUsernameProblemLanguageResultExecution timeMemory
1168713Br3adCity Mapping (NOI18_citymapping)C++20
0 / 100
17 ms580 KiB
#include <iostream> #include <fstream> #include <iomanip> #include <algorithm> #include <functional> #include <numeric> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include "citymapping.h" using namespace std; #define ll long long #define ull unsigned long long #define f first #define s second #define PF push_front #define PB push_back #define MP make_pair #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define max(a, b) ((a > b)? a : b) #define min(a, b) ((a < b)? a : b) #define max3(a, b, c) max(max(a, b), c) #define min3(a, b, c) min(min(a, b), c) const int N = 1e3 + 5; const int M = 1e9 + 7; const int inf = 0x3f3f3f3f; const ll int INF = 1e18; // ll get_distance(int x, int y){ // int dis[6][6]; // dis[1][2] = 9; // dis[1][3] = 15; // dis[1][4] = 8; // dis[1][5] = 18; // dis[2][3] = 8; // dis[2][4] = 1; // dis[2][5] = 11; // dis[3][4] = 7; // dis[3][5] = 3; // dis[4][5] = 10; // if(x > y) swap(x, y); // return dis[x][y]; // } vector<vector<pair<int, int>>> adj(1005, vector<pair<int, int>>()); vector<int> sz(1005); vector<bool> block(1005, false); void get_sz(int cur){ sz[cur] = 1; for(auto [child, _] : adj[cur]){ if(block[child]) continue; get_sz(child); sz[cur] += sz[child]; } } void find_roads(int n, int q, int a[], int b[], int w[]){ vector<pair<ll, int>> dis; vector<ll> dis_to(n+1); for(int i = 2; i <= n; i++){ ll temp = get_distance(1, i); dis.PB(MP(temp, i)); dis_to[i] = temp; } sort(all(dis)); adj[1].PB(MP(dis[0].s, dis[0].f)); vector<bool> added(n+1, false); added[1] = true; added[dis[0].s] = true; for(int i = 1; i < n-1; i++){ int root = 1; int cur = dis[i].s; while(true){ for(int j = 1; j <= n; j++) sz[j] = 0; get_sz(root); if(sz[root] == 1) break; int mid = root; for(int j = 1; j <= n; j++) if(sz[j] > 0){ int dif = abs(sz[j] - (sz[root]/2)); if(dif < abs(sz[mid] - (sz[root]/2))){ mid = j; } } int dist = get_distance(cur, mid); if(dis_to[mid] + dist == dis_to[cur]){ // Correct subtree root = mid; }else { block[mid] = true; } } adj[root].PB(MP(cur, dis_to[cur] - dis_to[root])); } int cnt = 0; for(int i = 1; i <= n; i++){ for(auto [child, weight] : adj[i]){ a[cnt] = i; b[cnt] = child; w[cnt] = weight; cnt++; } } } // int main(){ // // ios::sync_with_stdio(false); // cin.tie(NULL); // // // ifstream cin(); // // ofstream cout(); // // const int sz = 5; // int a[sz], b[sz], w[sz]; // find_roads(5, 50000, a, b, w); // // for(int i = 0; i < sz-1; i++){ // cout << a[i] << ' ' << b[i] << ' ' << w[i] << endl; // } // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...