Submission #1068893

#TimeUsernameProblemLanguageResultExecution timeMemory
1068893_8_8_Chameleon's Love (JOI20_chameleon)C++17
64 / 100
43 ms888 KiB
#include "chameleon.h" #include <bits/stdc++.h> using namespace std; const int N = 5e3 + 12; vector<int> g[N]; int n; void make(vector<int> &l,vector<int> &r,int i) { l.clear(); r.clear(); vector<int> d(N,0); vector<int> x,y; function<void(int)>dfs = [&](int v) { if(d[v] & 1) { x.push_back(v); } else { y.push_back(v); } for(int to:g[v]) { if(!d[to]) { d[to] = d[v] + 1; dfs(to); } } }; for(int j = 1;j < i;j++) { if(!d[j]) { d[j] = 1; x.clear(); y.clear(); dfs(j); if((int)x.size() < (int)y.size()) { x.swap(y); } for(int j:x ) { l.push_back(j); } for(int j:y ) { r.push_back(j); } } } } bool vis[N]; int to[N],fr[N]; set<int> st[N]; void Solve(int n_) { n = n_; vector<int> l,r; for(int i = 2;i <= n + n;i++) { make(l,r,i); auto ed = [&](vector<int> &x) -> void{ int it = 0,m = (int)x.size(); while(it < m) { if((int)g[i].size() == 3) break; int l = it - 1,r = m; while(r - l > 1) { int mid = (l + r) >> 1; vector<int> t(1,i); for(int j = it; j <= mid; ++j) { t.push_back(x[j]); } if(Query(t) != (int)t.size()) { r = mid; } else { l = mid; } } if(r != m) { g[i].push_back(x[r]); g[x[r]].push_back(i); } if((int)g[i].size() == 3) break; it = r + 1; } }; ed(l); ed(r); } for(int i = 1;i <= n + n;i++) { if(vis[i]) continue; if(g[i].size() == 1) { Answer(i,g[i][0]); vis[i] = vis[g[i][0]] = 1; } } for(int i = 1;i <= n + n;i++) { if(vis[i]) continue; for(int j:g[i]) { if(vis[j]) continue; st[i].insert(j); } } for(int i = 1;i <= n + n;i++) { if(vis[i]) continue; if((int)st[i].size() == 1) continue; if((int)g[i].size() >= 2 &&Query({i,g[i][0],g[i][1]}) == 1) { st[i].erase(g[i][2]); st[g[i][2]].erase(i); } else if(g[i].size() >= 3 && Query({i,g[i][2],g[i][1]}) == 1) { st[i].erase(g[i][0]); st[g[i][0]].erase(i); } else if(g[i].size() >= 3 && Query({i,g[i][0],g[i][2]}) == 1){ st[i].erase(g[i][1]); st[g[i][1]].erase(i); } } for(int i = 1;i <= n + n;i++) { if(vis[i] || st[i].empty()) continue; int t = (*st[i].begin()); Answer(i,t); vis[i] = vis[t] = 1; } }
#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...