Submission #278418

#TimeUsernameProblemLanguageResultExecution timeMemory
278418KastandaSplit the Attractions (IOI19_split)C++14
100 / 100
214 ms26220 KiB
// M #include<bits/stdc++.h> #include "split.h" using namespace std; const int N = 100005; int n, K[3], Cl[3], M[N], SZ[N], MR[N]; vector < int > C, vec, Adj[N], Ad[N], G[N]; void DFS(int v) { M[v] = SZ[v] = 1; for (int u : Adj[v]) if (!M[u]) { Ad[v].push_back(u); Ad[u].push_back(v); DFS(u); SZ[v] += SZ[u]; } } int Centroid(int v, int p = -1) { for (int u : Ad[v]) if (u != p && SZ[u] * 2 > n) return Centroid(u, v); return v; } void DFS2(int v, int p = -1) { SZ[v] = 1; for (int u : Ad[v]) if (u != p) DFS2(u, v), SZ[v] += SZ[u]; } void Color(int v, int p, int c) { if (!K[c]) return ; C[v] = Cl[c]; K[c] --; for (int u : Ad[v]) if (u != p && !C[u]) Color(u, v, c); } void MarkAs(int v, int p, int mr) { MR[v] = mr; for (int u : Ad[v]) if (u != p) MarkAs(u, v, mr); } void Go(int v) { M[v] = 1; vec.push_back(v); for (int u : G[v]) if (!M[u]) Go(u); } vector < int > find_split(int _n, int a, int b, int c, vector < int > V, vector < int > U) { n = _n; K[0] = a; K[1] = b; K[2] = c; Cl[0] = 1; Cl[1] = 2; Cl[2] = 3; for (int i = 0; i < 3; i ++) for (int j = i + 1; j < 3; j ++) if (K[i] > K[j]) swap(K[i], K[j]), swap(Cl[i], Cl[j]); assert(K[0] <= K[1] && K[1] <= K[2]); int m = (int)V.size(); for (int i = 0; i < m; i ++) { Adj[V[i]].push_back(U[i]); Adj[U[i]].push_back(V[i]); } DFS(0); int Cent = Centroid(0); DFS2(Cent); C = vector < int > (n, 0); for (int u : Ad[Cent]) if (SZ[u] >= K[0]) { Color(u, Cent, 0); Color(Cent, -1, 1); for (int i = 0; i < n; i ++) if (!C[i]) C[i] = Cl[2]; return C; } for (int u : Ad[Cent]) MarkAs(u, Cent, u); for (int i = 0; i < m; i ++) if (V[i] != Cent && U[i] != Cent && MR[V[i]] != MR[U[i]]) G[MR[V[i]]].push_back(MR[U[i]]), G[MR[U[i]]].push_back(MR[V[i]]); memset(M, 0, sizeof(M)); for (int u : Ad[Cent]) if (!M[u]) { vec.clear(); Go(u); int sz = 0; for (int i = 0; i < (int)vec.size(); i ++) { sz += SZ[vec[i]]; if (sz >= K[0]) { for (int j = 0; j <= i; j ++) Color(vec[j], Cent, 0); Color(Cent, -1, 1); for (int i = 0; i < n; i ++) if (!C[i]) C[i] = Cl[2]; return C; } } } return C; }
#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...