Submission #1205760

#TimeUsernameProblemLanguageResultExecution timeMemory
1205760mychecksedadChameleon's Love (JOI20_chameleon)C++20
100 / 100
30 ms488 KiB
#include "chameleon.h" #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 5e3+10, K = 52, MX = 30; namespace { mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int rn(int l, int r){ return uniform_int_distribution<int>(l,r)(rng); } vector<bool> done; void answer(int x, int y){ if(done[x] || done[y]) return; done[x] = done[y] = 1; // cerr << x << ' ' << y << '\n'; Answer(x, y); } int query(vi &A, int l, int r, int other){ vi v; for(int j = l; j <= r; ++j) v.pb(A[j]); v.pb(other); return Query(v); } void dfs(int v, int col, vi &vis, vector<vi> &g){ vis[v] = col; for(int u: g[v]){ if(!vis[u]){ dfs(u, 3 - col, vis, g); }else{ assert(vis[u] != vis[v]); } } } } void Solve(int n) { vi loves(2*n+1); done.resize(2*n + 1); vector<vi> g(2*n + 1); for(int i = 1; i <= 2*n; ++i){ vector<int> vis(2*n+1); for(int j = 1; j < i; ++j){ if(!vis[j]){ dfs(j, 1, vis, g); } } vi A, B; for(int j = 1; j < i; ++j){ if(vis[j] == 1) A.pb(j); else B.pb(j); } for(int rep = 0; rep < 2; ++rep){ int last = int(A.size()) - 1; for(int rp = 0; rp < 3; ++rp){ int l = 0, r = last, res = -1; if(l > r || query(A, l, r, i) == r - l + 2) break; while(l <= r){ int mid = l+r>>1; if(query(A, mid, r, i) < r - mid + 2){ res = mid; l = mid + 1; }else{ r = mid - 1; } } assert(res != -1); g[i].pb(A[res]); g[A[res]].pb(i); last = res - 1; } swap(A, B); } } for(int i = 1; i <= n*2; ++i){ if(g[i].size() == 1){ answer(g[i][0], i); }else{ vi S = {g[i][0], g[i][1], g[i][2]}; vi A = {S[0], S[1], i}; vi B = {S[0], S[2], i}; vi C = {S[1], S[2], i}; int a = Query(A); int b = Query(B); int c = Query(C); if(a == 1) loves[i] = S[2]; if(b == 1) loves[i] = S[1]; if(c == 1) loves[i] = S[0]; } } for(int i = 1; i <= n*2; ++i){ if(g[i].size() == 1){ answer(g[i][0], i); }else{ for(int u: g[i]){ if(loves[u] != i && loves[i] != u){ answer(u, i); } } } } }
#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...