답안 #704369

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
704369 2023-03-02T04:23:27 Z Hiennoob123 Park (JOI17_park) C++14
47 / 100
455 ms 580 KB
#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";
       // if(ptr[b]==T[a].size()&&Last[b]==a) return;
        Last[b] = a;
        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] = 0;
        vector<ll> rr, used;
        for(int i = 1; i< n; i++) rr.push_back(i);
        int ti = 0;
        while(rr.size()>0)
        {
            random_shuffle(rr.begin(), rr.end());
            for(auto u: rr)
            {
                dfs(Last[u], u);
                if(chk[u]) continue;
                //cout << u << " ";
                used.push_back(u);
            }
            rr = used;
            used.clear();
        }
        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

park.cpp: In function 'void task3::dfs(int, int)':
park.cpp:107:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |         for(; ptr[b]< T[a].size(); ptr[b]++)
      |               ~~~~~~^~~~~~~~~~~~~
park.cpp: In function 'void task3::solve()':
park.cpp:138:13: warning: unused variable 'ti' [-Wunused-variable]
  138 |         int ti = 0;
      |             ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 7 ms 372 KB Output is correct
3 Correct 5 ms 340 KB Output is correct
4 Correct 5 ms 340 KB Output is correct
5 Correct 5 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 214 ms 564 KB Output is correct
2 Correct 81 ms 552 KB Output is correct
3 Correct 82 ms 564 KB Output is correct
4 Correct 168 ms 512 KB Output is correct
5 Correct 176 ms 552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 333 ms 456 KB Output is correct
2 Correct 455 ms 456 KB Output is correct
3 Correct 339 ms 476 KB Output is correct
4 Correct 311 ms 580 KB Output is correct
5 Correct 335 ms 484 KB Output is correct
6 Correct 359 ms 464 KB Output is correct
7 Correct 320 ms 456 KB Output is correct
8 Correct 371 ms 460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 243 ms 540 KB Output is correct
2 Incorrect 245 ms 444 KB Wrong Answer[5]
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 147 ms 516 KB Wrong Answer[5]
2 Halted 0 ms 0 KB -