제출 #1151821

#제출 시각아이디문제언어결과실행 시간메모리
1151821PacybwoahSplit the Attractions (IOI19_split)C++20
0 / 100
635 ms1114112 KiB
#include "split.h" #include<iostream> #include<algorithm> #include<vector> #include<cassert> #include<utility> #include<random> #include<chrono> using namespace std; namespace{ vector<int> ord; vector<int> sz, pa, vis; vector<vector<int>> graph; void dfs(int node, int parent){ cout << node << " " << parent << "\n"; sz[node] = 1; pa[node] = parent; ord.push_back(node); vis[node] = 1; for(auto &x: graph[node]){ //cout << x << " " << vis[x] << " " << parent << "\n"; if(vis[x]) continue; if(x == parent) continue; dfs(x, node); sz[node] += sz[x]; } } void dfs_ban(int node, int parent, int ban){ ord.push_back(node); for(auto &x: graph[node]){ if(x == parent || x == ban) continue; dfs_ban(x, node, ban); } } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { vector<int> ans(n); sz.resize(n); graph.resize(n); pa.resize(n); vis.resize(n); for(int i = 0; i < (int)p.size(); i++){ graph[p[i]].push_back(q[i]); graph[q[i]].push_back(p[i]); } dfs(0, 0); if(a == 1){ //for(auto x: ord) cout << x << ' '; assert((int)ord.size() == n); for(int i = 0; i < b; i++) ans[ord[i]] = 2; for(int i = b; i < b + c; i++) ans[ord[i]] = 3; ans[ord[n - 1]] = 1; return ans; } int na = 1, nb = 2, nc = 3; if(a > b){ swap(a, b); swap(na, nb); } if(b > c){ swap(b, c); swap(nb, nc); } if(a > b){ swap(a, b); swap(na, nb); } auto seed = chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937_64 mt(seed); auto st = clock(); while(float(clock() - st) / CLOCKS_PER_SEC < 1.95){ for(int i = 0; i < n; i++) shuffle(graph[i].begin(), graph[i].end(), mt); vector<int>().swap(ord); fill(vis.begin(), vis.end(), 0); uniform_int_distribution<int> dis(0, n - 1); int node = dis(mt); dfs(node, node); //for(auto &x: ord) cout << x << " "; vector<int> old = ord, pos(n); for(int i = 0; i < n; i++) pos[ord[i]] = i; vector<int>().swap(ord); for(int i = 0; i < n; i++){ if(sz[i] >= a && n - sz[i] >= b){ dfs_ban(pa[i], pa[i], i); for(int j = pos[i]; j < pos[i] + a; j++) ans[old[j]] = na; for(int j = 0; j < b; j++) ans[ord[j]] = nb; for(int j = 0; j < n; j++) if(ans[j] == 0) ans[j] = nc; return ans; } if(sz[i] >= b && n - sz[i] >= a){ dfs_ban(pa[i], pa[i], i); for(int j = pos[i]; j < pos[i] + b; j++) ans[old[j]] = nb; for(int j = 0; j < a; j++) ans[ord[j]] = na; for(int j = 0; j < n; j++) if(ans[j] == 0) ans[j] = nc; return ans; } } } return ans; } // g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run split.cpp grader.cpp
#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...