제출 #1302313

#제출 시각아이디문제언어결과실행 시간메모리
1302313Valaki2이주 (IOI25_migrations)C++20
79.12 / 100
39 ms2164 KiB
#include "migrations.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define pii pair<int, int> #define fi first #define se second const int big_n = 1e4; const int bitcnt_1 = 21; const int bitcnt_2 = 14; int n; vector<int> par; vector<vector<int> > graph; vector<vector<int> > children; int A, B; int diam; // maybe bigger is not enough, first part has to be bigger as well? // so that negative .se; etc. pii dfs_furthest(int cur, int pr) { pii res = mp(0, cur); for(int nei : graph[cur]) { if(nei != pr) { pii this_res = dfs_furthest(nei, cur); this_res.fi++; res = max(res, this_res); } } return res; } int dist(int cur, int pr, int goal) { if(cur == goal) { return 0; } int res = 1e5; for(int nei : graph[cur]) { if(nei != pr) { res = min(res, dist(nei, cur, goal) + 1); } } return res; } void init() { par.assign(big_n, -1); graph.resize(big_n); children.resize(big_n); } signed send_message(signed N, signed i, signed Pi) { n = i + 1; if(n == 2) { init(); } par[i] = Pi; graph[i].pb(par[i]); graph[par[i]].pb(i); children[par[i]].pb(i); int pos = bitcnt_1 - (big_n - n + 1); if(pos < 0) { return 0; } if(pos == 0) { pii deepest = dfs_furthest(0, -1); A = deepest.se; deepest = dfs_furthest(A, -1); B = deepest.se; diam = deepest.fi; } if(pos < 7) { pii deepest = dfs_furthest(i, -1); if(deepest.fi > diam && dist(i, -1, A) <= diam) { A = i; diam++; return 4; } else { if(deepest.fi > diam) { diam++; } return (A >> (2 * pos)) & 3; } } pos -= 7; pii deepest = dfs_furthest(i, -1); if(deepest.fi <= diam) { return (B >> pos) & 1; } if(dist(i, -1, A) <= diam) { // A valtozik A = i; diam++; return ((B >> pos) & 1) + 2; } else { // B valtozik B = i; diam++; return 4; } /*if (i == 1) return 10; else if (i == 2) return 20; else if (i == 3) return 30; else return 0;*/ } pair<signed, signed> longest_path(vector<signed> S) { int A = 0, B = 0; bool A_set = false, B_set = false; for(int i = big_n - bitcnt_1; i < big_n - bitcnt_2; i++) { if(S[i] == 4) { A_set = true; A = i; } } for(int i = big_n - bitcnt_2; i < big_n; i++) { if(S[i] >= 2 && S[i] <= 3) { A_set = true; A = i; } } if(!A_set) { int pos = 1; for(int i = big_n - bitcnt_1; i < big_n - bitcnt_2; i++) { A += pos * S[i]; pos *= 4; } } for(int i = big_n - bitcnt_2; i < big_n; i++) { if(S[i] == 4) { B_set = true; B = i; } } if(!B_set) { int pos = 1; for(int i = big_n - bitcnt_2; i < big_n; i++) { B += pos * (S[i] % 2); pos *= 2; } } /*for(int i = 0; i < 6; i++) { for(int j = 0; j < 6; j++) { cout << dist(i, -1, j) << " "; } cout << "\n"; }*/ //cout << overall_best.fi << " " << overall_best.se << "\n"; return mp(A, B); //return {0, 3}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...