답안 #1029192

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1029192 2024-07-20T13:43:17 Z Mr_Husanboy 가장 긴 여행 (IOI23_longesttrip) C++17
15 / 100
9 ms 600 KB
#include "longesttrip.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ff first
#define ss second
#define all(a) (a).begin(), (a).end()

template<typename T>
int len(T &a){return a.size();}


int ask(int a, int b){
    return are_connected({a}, {b});
}



vector<int> longest_trip(int n, int d)
{
    if(d >= 2){
        deque<int> cur = {0};
        vector<int> done(n, 0);
        done[0] = 1;
        for(int i = 1; i < n; i ++){
            if(ask(cur[0], i)){
                cur.push_back(i);
                done[i] = 1;
                break;
            }
        }
        for(int i = 0; i < n; i ++){
            if(done[i]) continue;
            if(ask(cur[0], i)){
                cur.push_front(i);
            }else cur.push_back(i);
        }
        vector<int> res;
        for(auto u : cur) res.push_back(u);
        return res;  
    }
    deque<int> a = {0}, b = {1};
    for(int i = 2; i < n; i ++){
        if(ask(a.back(), i)){
            a.push_back(i);
        }else if(ask(b.back(), i)){
            b.push_back(i);
        }else{
            for(int i = len(b) - 1; i >= 0; i --) a.push_back(b[i]);
            b = {i};
        }
    }
    if(len(b) > len(a)) swap(a, b);
    vector<int> aa, bb;
    for(auto u : a) aa.push_back(u);
    for(auto u : b) bb.push_back(u);

    if(are_connected(aa, bb) == 0){
        if(len(aa) > len(bb)) return aa;
        return bb;
    }
    vector<int> res;
    if(ask(a[0], b[0])){
        for(int i = len(a) - 1; i >= 0; i --){
            res.push_back(a[i]);
        }
        for(int i = 0; i < len(b); i ++) res.push_back(b[i]);
        return res;
    }   
    if(ask(a[0], b.back())){
        for(auto u : b) res.push_back(u);
        for(int i = 0; i < len(a); i ++) res.push_back(a[i]);
        return res;
    }
    
    if(ask(a.back(), b[0])){
        for(auto u : a) res.push_back(u);
        for(auto u : b) res.push_back(u);
        return res;
    }

    if(ask(a.back(), b.back())){
        for(auto u : a) res.push_back(u);
        for(int i = len(b) - 1; i >= 0; i --)  res.push_back(b[i]);
        return res;
    }
    
    int l = -1, r = len(a);
    while(r - l > 1){
        int m = (l + r) / 2;
        vector<int> sh;
        for(int i = 0; i <= m; i ++) sh.push_back(a[i]);
        if(are_connected(sh, bb)){
            r = m;
        }else l = m;
    }
    int i = r;
    l = -1, r = len(b);
    while(r - l > 1){
        int m = (l + r) / 2;
        vector<int> sh;
        for(int i = 0; i <= m; i ++) sh.push_back(b[i]);
            if(are_connected({i}, sh)){
                r = m;
            }else l = m;
    }

    int j = r;

    for(int k = i + 1; k < len(a); k ++) res.push_back(a[k]);
    for(int k = 0; k <= i; k ++) res.push_back(a[k]);
    for(int k = j; k < len(b); k ++) res.push_back(b[k]);
    for(int k = 0; k < j; k ++) res.push_back(b[k]);
    return res;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 2 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 344 KB Output is correct
2 Correct 4 ms 344 KB Output is correct
3 Correct 5 ms 344 KB Output is correct
4 Correct 5 ms 344 KB Output is correct
5 Correct 6 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 344 KB Output is correct
2 Correct 5 ms 344 KB Output is correct
3 Correct 5 ms 344 KB Output is correct
4 Correct 5 ms 344 KB Output is correct
5 Correct 6 ms 344 KB Output is correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 5 ms 344 KB Output is correct
8 Correct 5 ms 344 KB Output is correct
9 Correct 3 ms 344 KB Output is correct
10 Correct 5 ms 344 KB Output is correct
11 Correct 5 ms 344 KB Output is correct
12 Correct 5 ms 344 KB Output is correct
13 Correct 4 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 344 KB Output is correct
2 Correct 8 ms 344 KB Output is correct
3 Correct 4 ms 344 KB Output is correct
4 Correct 6 ms 436 KB Output is correct
5 Correct 4 ms 344 KB Output is correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 6 ms 344 KB Output is correct
8 Correct 5 ms 344 KB Output is correct
9 Correct 8 ms 344 KB Output is correct
10 Correct 5 ms 344 KB Output is correct
11 Correct 5 ms 344 KB Output is correct
12 Correct 4 ms 344 KB Output is correct
13 Correct 6 ms 600 KB Output is correct
14 Correct 7 ms 344 KB Output is correct
15 Correct 8 ms 344 KB Output is correct
16 Incorrect 1 ms 344 KB non-disjoint arrays
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 344 KB Output is correct
2 Correct 8 ms 344 KB Output is correct
3 Correct 5 ms 344 KB Output is correct
4 Correct 5 ms 344 KB Output is correct
5 Correct 4 ms 344 KB Output is correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 7 ms 344 KB Output is correct
8 Correct 5 ms 344 KB Output is correct
9 Correct 4 ms 344 KB Output is correct
10 Correct 5 ms 344 KB Output is correct
11 Correct 5 ms 344 KB Output is correct
12 Correct 5 ms 344 KB Output is correct
13 Correct 6 ms 344 KB Output is correct
14 Correct 7 ms 344 KB Output is correct
15 Correct 7 ms 344 KB Output is correct
16 Incorrect 1 ms 344 KB non-disjoint arrays
17 Halted 0 ms 0 KB -