제출 #1190120

#제출 시각아이디문제언어결과실행 시간메모리
1190120hamzabc가장 긴 여행 (IOI23_longesttrip)C++20
100 / 100
5 ms416 KiB
#include "longesttrip.h"
#include <bits/stdc++.h>


using namespace std;
#define all(x) x.begin(), x.end()


vector<int> longest_trip(int N, int D){
    vector<int> prv(N, -1), nxt(N, -1);
    long long int notret = -1, notb = -1, b = 0, nw = 0;
    bool flag = false;
    for (int i = 1; i < N; i++){
        int k = are_connected({ nw }, { i });
        if (k == false){
            if (notret == -1){
                notret = i;
                notb = i;
            }else{
                if (flag){
                    k = false;
                }else{
                    k = are_connected({ nw }, { notret });
                }
                if (k == false){
                    prv[notret] = i;
                    nxt[i] = notret;
                    notret = i;
                    flag = true;
                }else{
                    nxt[nw] = notret;
                    prv[notret] = nw;
                    nw = notb;
                    notb = i;
                    notret = i;
                }
            }
        }else{
            nxt[nw] = i;
            prv[i] = nw;
            nw = i;
            flag = false;
        }
    }
    vector<int> ret;
    if (notret == -1){
        for (int i = b; i != -1; i = nxt[i]) ret.push_back(i);
    }else{
        swap(notb, notret);
        vector<int> yl1, yl2;
        for (int i = b; i != -1; i = nxt[i]) yl1.push_back(i);
        for (int i = notb; i != -1; i = nxt[i]) yl2.push_back(i);
        int k = are_connected(yl1, yl2);
        if (k == false){
            if (yl1.size() > yl2.size()){
                ret = yl1;
            }else{
                ret = yl2;
            }
        }else{
            if (yl2.size() == 1){
                k = are_connected({ yl2.back() }, { yl1.back(), yl1.front() });
            }else if (yl1.size() == 1){
                k = are_connected({ yl2.back(), yl2.front() }, { yl1.back() });
            }else{
                k = are_connected({ yl2.back(), yl2.front() }, { yl1.back(), yl1.front() });
            }
            if (k == true){
                if (yl1.size() == 1){
                    for (int i = 0; i < yl1.size(); i++) ret.push_back(yl1[i]);
                    if (yl2.size() == 1){
                        for (int i = 0; i < yl2.size(); i++) ret.push_back(yl2[i]);
                    }else{
                        if (yl1.size() == 1){
                            k = are_connected( { yl1.back() }, { yl2.front() } );
                        }else{
                            k = are_connected( { yl1.back(), yl1.front() }, { yl2.front() } );
                        }
                        if (k){
                            for (int i = 0; i < yl2.size(); i++) ret.push_back(yl2[i]);
                        }else{
                            for (int i = yl2.size() - 1; i >= 0; i--) ret.push_back(yl2[i]);
                        }
                    }
                    return ret;
                }
                if (yl2.size() == 1){
                    if (yl2.size() == 1){
                        k = are_connected( { yl1.back() }, { yl2.back() } );
                    }else{
                        k = are_connected( { yl1.back() }, { yl2.back(), yl2.front() } );
                    }
                    if (k){
                        for (int i = 0; i < yl1.size(); i++) ret.push_back(yl1[i]);
                    }else{
                        for (int i = yl1.size() - 1; i >= 0; i--) ret.push_back(yl1[i]);
                    }
                    for (int i = 0; i < yl2.size(); i++) ret.push_back(yl2[i]);
                    return ret;
                }
                k = are_connected( { yl1.back() }, { yl2.front() } );
                if (k){
                    for (int i = 0; i < yl1.size(); i++) ret.push_back(yl1[i]);
                    for (int i = 0; i < yl2.size(); i++) ret.push_back(yl2[i]);
                    return ret;
                }
                k = are_connected( { yl1.back() }, { yl2.back() } );
                if (k){
                    for (int i = 0; i < yl1.size(); i++) ret.push_back(yl1[i]);
                    for (int i = yl2.size() - 1; i >= 0; i--) ret.push_back(yl2[i]);
                    return ret;
                }
                k = are_connected( { yl1.front() }, { yl2.front() } );
                if (k){
                    for (int i = yl1.size() - 1; i >= 0; i--) ret.push_back(yl1[i]);
                    for (int i = 0; i < yl2.size(); i++) ret.push_back(yl2[i]);
                    return ret;
                }
                for (int i = yl1.size() - 1; i >= 0; i--) ret.push_back(yl1[i]);
                for (int i = yl2.size() - 1; i >= 0; i--) ret.push_back(yl2[i]);
                return ret;
            }
            vector<int> src;
            int add = 0, add2 = 0;
            reverse(all(yl1));
            for (int i = ceil(log2(yl1.size())) - 1; i >= 0; i--){
                i = min(i, (int)ceil(log2(yl1.size() - add)) - 1);
                if (i == -1)
                    break;
                src.clear();
                for (int o = 0; o < (1LL << i); o++){
                    src.push_back(yl1[o + add]);
                }
                k = are_connected(src, yl2);
                if (k == false){
                    add += (1LL << i);
                }
            }
            add = yl1.size() - 1 - add;
            reverse(all(yl1));
            for (int i = ceil(log2(yl2.size())) - 1; i >= 0; i--){
                i = min(i, (int)ceil(log2(yl2.size() - add2)) - 1);
                if (i == -1)
                    break;
                src.clear();
                for (int o = 0; o < (1LL << i); o++){
                    src.push_back(yl2[o + add2]);
                }
                k = are_connected(src, { yl1[add] });
                if (k == false){
                    add2 += (1LL << i);
                }
            }
            if (add != yl1.size() - 1){
                prv[b] = nw;
                nxt[nw] = b;
                b = nxt[yl1[add]];
                prv[nxt[yl1[add]]] = -1;
            }
            if (add2){
                prv[notb] = notret;
                nxt[notret] = notb;
                nxt[prv[yl2[add2]]] = -1;
            }
            nxt[yl1[add]] = yl2[add2];
            prv[yl2[add2]] = yl1[add];
            ret.clear();
            for (int i = b; i != -1; i = nxt[i]) ret.push_back(i);
        }
    }
    return ret;
}

컴파일 시 표준 에러 (stderr) 메시지

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:14:33: warning: narrowing conversion of 'nw' from 'long long int' to 'int' [-Wnarrowing]
   14 |         int k = are_connected({ nw }, { i });
      |                                 ^~
longesttrip.cpp:14:33: warning: narrowing conversion of 'nw' from 'long long int' to 'int' [-Wnarrowing]
longesttrip.cpp:23:41: warning: narrowing conversion of 'nw' from 'long long int' to 'int' [-Wnarrowing]
   23 |                     k = are_connected({ nw }, { notret });
      |                                         ^~
longesttrip.cpp:23:41: warning: narrowing conversion of 'nw' from 'long long int' to 'int' [-Wnarrowing]
longesttrip.cpp:23:49: warning: narrowing conversion of 'notret' from 'long long int' to 'int' [-Wnarrowing]
   23 |                     k = are_connected({ nw }, { notret });
      |                                                 ^~~~~~
longesttrip.cpp:23:49: warning: narrowing conversion of 'notret' from 'long long int' to 'int' [-Wnarrowing]
#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...