Submission #704360

#TimeUsernameProblemLanguageResultExecution timeMemory
704360Hiennoob123Park (JOI17_park)C++14
47 / 100
440 ms644 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] = {}; ll ptr[maxn] = {}; void dfs(ll a, ll b) { //cout << a << " " << b << " " << Last[b] << "\n"; //cout << T[a].size() << "\n"; bool done = 0; for(; ptr[b]< T[a].size(); ptr[b]++) { if(mid(0, T[a][ptr[b]], b)) { ll save = ptr[b]; ptr[b] = 0; dfs(T[a][save], b); done = 1; break; } } if(!done) { Last[b] = a; if(adj(a, b)) { chk[b] = 1; T[a].push_back(b); Edge.push_back(mp(a, b)); return; } return; } } void solve() { queue<ll> q; for(int i = 0; i< n; i++) Last[i] = -1; vector<ll> rr; for(int i = 1; i< n; i++) rr.push_back(i); random_shuffle(rr.begin(), rr.end()); for(auto u: rr) q.push(u); int ti = 0; while(!q.empty()) { ti++; ll x = q.front(); q.pop(); dfs(max(0,Last[x]), x); 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(); else task3::solve(); }

Compilation message (stderr)

park.cpp: In function 'void task3::dfs(int, int)':
park.cpp:105:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |         for(; ptr[b]< T[a].size(); ptr[b]++)
      |               ~~~~~~^~~~~~~~~~~~~
#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...