Submission #1068863

#TimeUsernameProblemLanguageResultExecution timeMemory
1068863_8_8_Chameleon's Love (JOI20_chameleon)C++17
44 / 100
64 ms860 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); function<void(int)>dfs = [&](int v) { if(d[v] & 1) { l.push_back(v); } else { r.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; dfs(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) { 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); } it = r + 1; } }; ed(l); ed(r); // return; } // for(int i = 1;i <=n + n;i++) { // cout << i << '\n'; // for(int j:g[i]) { // cout << j << ' '; // } // cout << '\n'; // } 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; // cout << i << '\n'; for(int j:g[i]) { // if(vis[j]) continue; st[i].insert(j); // cout << j << ' '; } // cout << '\n'; } for(int i = 1;i <= n + n;i++) { // if(vis[i]) continue; // cout << i << ' '; 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); // cout << g[i][2] << '\n'; } 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); // cout << g[i][0] << '\n'; } 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); // cout << g[i][1] << '\n'; } else { // cout << "x\n"; } } for(int i = 1;i <= n + n;i++) { if(vis[i] || st[i].empty()) continue; int t = (*st[i].begin()); // cout << i << ' ' << t << '\n'; 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...