Submission #704325

#TimeUsernameProblemLanguageResultExecution timeMemory
704325Hiennoob123Park (JOI17_park)C++14
20 / 100
2077 ms648 KiB
#include "park.h" #include <bits/stdc++.h> #define ll int #define ld long double #define pll pair<ll,ll> #define pb push_back #define mp make_pair #define fi first #define se second using namespace std; const ll maxn = 1405; static int Place[1400]; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ll random(ll l ,ll r) { ll x = rng(); return (abs(x)%(r-l+1)+l); } ll t, n; vector<pll> Edge; ll par[maxn]; ll find_par(ll v) { if(v==par[v]) return v; else return par[v] = find_par(par[v]); } bool mid(ll a, ll b, ll c) { if(a>c) swap(a, c); //cout << a << " " << b << " " << c << "\n"; for(int i = 0; i< n; i++) Place[i] = 1; Place[b] = 0; return !Ask(a, c, Place); } bool adj(ll a, ll b) { if(a>b) swap(a, b); //cout << a << " " << b << "\n"; for(int i = 0; i< n; i++) Place[i] = 0; Place[a] = Place[b] = 1; return Ask(a, b, Place); } void Answ() { for(auto u: Edge) { if(u.fi>u.se) swap(u.fi, u.se); //cout << u.fi << " " << u.se << "\n"; Answer(u.fi, u.se); } } namespace task1 { void solve() { for(int i = 0; i< n; i++) { for(int j = i+1; j< n; j++) { if(adj(i, j)) Edge.push_back(mp(i, j)); } } Answ(); } } namespace task2 { void dfs(ll a, ll b, vector<ll> T) { if(T.size()==0) { Edge.push_back(mp(a, b)); return; } vector<ll> A, B; ll x = T[random(0, T.size()-1)]; for(auto u: T) { if(u==x) continue; if(mid(a, u, x)) A.push_back(u); else B.push_back(u); } dfs(a, x, A); dfs(b, x ,B); } void solve() { vector<ll> T; for(int i = 1; i< n-1; i++) T.push_back(i); dfs(0, n-1, T); Answ(); } } namespace task3 { vector<ll> T[maxn]; bool chk[maxn]; ll Last[maxn] = {}; void dfs(ll a, ll b) { if(T[a].size()==0&&Last[b]==a) return; if(T[a].size()==0) { Last[b] = a; if(adj(a, b)) { chk[b] = 1; T[a].push_back(b); return; } return; } for(auto u: T[a]) { if(mid(0, u, b)) { dfs(u, b); } } } void solve() { queue<ll> q; for(int i = 1; i< n; i++) q.push(i); while(!q.empty()) { ll x = q.front(); q.pop(); dfs(Last[x], 0); if(chk[x]) continue; q.push(x); } Answ(); } } void Detect(int xaa, int xa) { t = xaa; n = xa; if(t==1) task1::solve(); else if(t==2) task2::solve(); else if(t==3) task3::solve(); }
#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...