Submission #1177125

#TimeUsernameProblemLanguageResultExecution timeMemory
1177125alexander707070Longest Trip (IOI23_longesttrip)C++20
15 / 100
4 ms416 KiB
#include<bits/stdc++.h>

#include "longesttrip.h"

using namespace std;

int n,d;
vector<int> l,r;

bool query(vector<int> a,vector<int> b){
    return are_connected(a,b);
}

vector<int> longest_trip(int N, int D){
    n=N; d=D;
    l.clear(); r.clear();

    l.push_back(0);

    if(query({0},{1})){
        l.push_back(1);
    }else{
        r.push_back(1);
    }

    for(int i=2;i<n;i++){
        if(query({l.back()},{i})){
            l.push_back(i);

            if(!r.empty() and query({r.back()},{i})){
                while(!r.empty()){
                    l.push_back(r.back());
                    r.pop_back();
                }
            }
        }else{
            r.push_back(i);
        }
    }

    if(d==1){
        if(r.empty())return l;

        if(!query(l,r)){
            if(l.size()>r.size())return l;
            else return r;
        }else{

            if(query({l.front()},{r.back()})){
                for(int i:l)r.push_back(i);
                return r;
            }

            if(query({r.front()},{l.back()})){
                for(int i:r)l.push_back(i);
                return l;
            }

            if(query({l.front()},{r.front()})){
                reverse(l.begin(),l.end());

                for(int i:r)l.push_back(i);
                return l;
            }

            cout<<1/0;

            int ll=-1,rr=int(l.size())-1,mid;

            while(ll+1<rr){
                mid=(ll+rr)/2;
                
                vector<int> w;
                for(int i=0;i<=mid;i++)w.push_back(l[i]);

                if(query(w,r)){
                    rr=mid;
                }else{
                    ll=mid;
                }
            }

            int from=rr;

            ll=-1; rr=int(r.size())-1;

            while(ll+1<rr){
                mid=(ll+rr)/2;
                
                vector<int> w;
                for(int i=0;i<=mid;i++)w.push_back(r[i]);

                if(query(l,w)){
                    rr=mid;
                }else{
                    ll=mid;
                }
            }

            int to=rr;
            
            vector<int> path;
            for(int i=from+1;i<l.size();i++)path.push_back(l[i]);
            for(int i=0;i<=from;i++)path.push_back(l[i]);

            for(int i=to;i<r.size();i++)path.push_back(r[i]);
            for(int i=0;i<to;i++)path.push_back(r[i]);

            return path;
        }
    }else{
        for(int i:l)r.push_back(i);
        return r;
    }

    return {};
}

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:66:20: warning: division by zero [-Wdiv-by-zero]
   66 |             cout<<1/0;
      |                   ~^~
#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...