Submission #802397

#TimeUsernameProblemLanguageResultExecution timeMemory
802397parsadox2Village (BOI20_village)C++14
100 / 100
122 ms30120 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int maxn = 1e5 + 10; int n , st[maxn] , fn[maxn] , dp[2][maxn] , par[2][maxn] , sz[maxn] , ar[maxn] , br[maxn] , pos[maxn]; vector <int> trav , adj[maxn] , child[maxn]; void dfs(int v , int p = -1) { st[v] = trav.size(); sz[v] = 1; trav.push_back(v); for(auto u : adj[v]) if(u != p) { dfs(u , v); sz[v] += sz[u]; } fn[v] = trav.size(); } bool cmp(int a , int b) { return dp[1][a] - dp[0][a] < dp[1][b] - dp[0][b]; } void solve(int v , int p = -1) { bool leaf = true; int sum = 0; for(auto u : adj[v]) if(u != p) { leaf = false; solve(u , v); child[v].push_back(u); sum += dp[0][u]; } if(leaf) { dp[1][v] = 0; dp[0][v] = maxn << 2; pos[v] = v; return; } sort(child[v].begin() , child[v].end() , cmp); //cout << v << " " << p << " : " << endl; //for(auto u : child[v]) // cout << u << " " << dp[0][u] << " " << dp[1][u] << endl; //cout << endl; int fsum = sum; dp[1][v] = sum; par[1][v] = 0; pos[v] = v; fsum += (dp[1][child[v][0]] - dp[0][child[v][0]]); //cout << fsum << endl; if(fsum + 2 < dp[1][v]) { par[1][v] = 1; dp[1][v] = fsum + 2; pos[v] = pos[child[v][0]]; } //cout << dp[1][v] << "!" << endl; for(int i = 1 ; i < child[v].size() ; i++) { int now = child[v][i]; fsum += (dp[1][now] - dp[0][now]); if(fsum + 2 * (i + 1) < dp[1][v]) { dp[1][v] = fsum + 2 * (i + 1); par[1][v] = i + 1; pos[v] = v; } } //cout << "SALAM" << endl; //cout << v << " " << p << endl; fsum = sum + dp[1][child[v][0]] - dp[0][child[v][0]]; dp[0][v] = fsum + 2; par[0][v] = 1; for(int i = 1 ; i < child[v].size() ; i++) { //cout << i << endl; int now = child[v][i]; fsum += (dp[1][now] - dp[0][now]); if(fsum + 2 * (i + 1) < dp[0][v]) { dp[0][v] = fsum + 2 * (i + 1); par[0][v] = i + 1; } } //cout << v << " " << dp[0][v] << " " << dp[1][v] << endl; //if(v == 5) // dp[1][v] = 2; } void Build(int v , int ty) { //cout << v << " " << ty << " " << child[v].size() << endl; if(child[v].size() == 0) return; for(int i = 0 ; i < par[ty][v] ; i++) Build(child[v][i] , 1); for(int i = par[ty][v] ; i < child[v].size() ; i++) Build(child[v][i] , 0); //cout << v << " " << ty << endl; for(int i = 0 ; i + 1 < par[ty][v] ; i++) ar[child[v][i]] = pos[child[v][i + 1]]; if(ty == 1) { if(par[ty][v] == 1) { ar[child[v][0]] = v; } else if(par[ty][v] != 0) ar[child[v][par[ty][v] - 1]] = pos[child[v][0]]; } else { ar[v] = pos[child[v][0]]; ar[child[v][par[ty][v] - 1]] = v; } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0 ; i < n - 1 ; i++) { int v , u; cin >> v >> u; adj[v].push_back(u); adj[u].push_back(v); } dfs(1); //cout << "DFSED" << endl; solve(1); //cout << "SOLVED" << endl; Build(1 , 0); //cout << "BUILt" << endl; int lar = 0 , sma = dp[0][1]; for(int i = 2 ; i <= n ; i++) lar += min(sz[i] , n - sz[i]) * 2; for(int i = 1 ; i <= n ; i++) br[i] = trav[(st[i] + (n / 2)) % n]; cout << sma << " " << lar << endl; for(int i = 1 ; i <= n ; i++) cout << ar[i] << " "; cout << endl; for(int i = 1 ; i <= n ; i++) cout << br[i] << " "; cout << endl; return 0; }

Compilation message (stderr)

Village.cpp: In function 'void solve(long long int, long long int)':
Village.cpp:63:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |  for(int i = 1 ; i < child[v].size() ; i++)
      |                  ~~^~~~~~~~~~~~~~~~~
Village.cpp:79:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |  for(int i = 1 ; i < child[v].size() ; i++)
      |                  ~~^~~~~~~~~~~~~~~~~
Village.cpp: In function 'void Build(long long int, long long int)':
Village.cpp:102:29: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |  for(int i = par[ty][v] ; i < child[v].size() ; i++)
      |                           ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...