Submission #1160715

#TimeUsernameProblemLanguageResultExecution timeMemory
1160715hyakupSplit the Attractions (IOI19_split)C++20
29 / 100
544 ms1114112 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; vector<vector<int>> adj; vector<int> resp, sub, pai; void dfs( int cur, int ancestor ){ pai[cur] = ancestor; sub[cur] = 1; for( int viz : adj[cur] ) if( viz != ancestor ){ dfs( viz, cur ); sub[cur] += sub[viz]; } } void dfs( int cur, int last, int &resto, int flag ){ if( resto == 0 ) return; resp[cur] = flag; resto--; for( int viz : adj[cur] ) if( viz != last ) dfs( viz, cur, resto, flag ); } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { adj.resize(n); resp.resize(n); sub.resize(n); pai.resize(n); for( int i = 0; i < n - 1; i++ ){ adj[p[i]].push_back(q[i]); adj[q[i]].push_back(p[i]); } vector<pair<int, int>> comps = { make_pair( a, 1 ), make_pair( b, 2 ), make_pair( c, 3 ) }; sort( comps.begin(), comps.end() ); dfs( 0, 0 ); bool ok = false; for( int i = 1; i < n; i++ ){ if( sub[i] >= comps[0].first && n - sub[i] >= comps[1].first ){ dfs( i, pai[i], comps[0].first, comps[0].second ); dfs( pai[i], i, comps[1].first, comps[1].second ); ok = true; break; } else if( sub[i] >= comps[1].first && n - sub[i] >= comps[0].first ){ dfs( pai[i], i, comps[0].first, comps[0].second ); dfs( i, pai[i], comps[1].first, comps[1].second ); ok = true; break; } } if( !ok ) return resp; for( int &x : resp ) if( x == 0 ) x = comps[2].second; return resp; }
#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...