Submission #1014634

# Submission time Handle Problem Language Result Execution time Memory
1014634 2024-07-05T08:35:03 Z JakobZorz Longest Trip (IOI23_longesttrip) C++17
85 / 100
14 ms 944 KB
#include"longesttrip.h"
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;

int n,miss;
int perm[1000];
vector<pair<int,int>>unc; // not connected
set<pair<int,int>>uncs;
map<pair<int,int>,bool>cache;
int qc;

vector<int>per(vector<int>arr){
    for(int&i:arr)
        i=perm[i];
    return arr;
}

bool connected(vector<int>a,vector<int>b){
    set<int>as{a.begin(),a.end()};
    set<int>bs{b.begin(),b.end()};
    a=vector<int>(as.begin(),as.end());
    b=vector<int>(bs.begin(),bs.end());
    bool res=are_connected(per(a),per(b));
    miss+=!res;
    qc++;
    return res;
}

bool connected(int a,int b){
    if(a>b)
        swap(a,b);
    if(cache.count({a,b}))
        return cache[{a,b}];
    cache[{a,b}]=connected(vector<int>({a}),vector<int>({b}));
    if(!cache[{a,b}]){
        uncs.insert({a,b});
        uncs.insert({b,a});
    }
    return cache[{a,b}];
}

pair<int,int>find_conn(vector<int>v1,vector<int>v2){
    int l1=0,r1=(int)v1.size();
    while(l1<r1-1){
        int mid=(l1+r1)/2;
        vector<int>v;
        for(int i=l1;i<mid;i++)
            v.push_back(v1[i]);
        if(connected(v,v2))
            r1=mid;
        else
            l1=mid;
    }
    
    int l2=0,r2=(int)v2.size();
    while(l2<r2-1){
        int mid=(l2+r2)/2;
        vector<int>v;
        for(int i=l2;i<mid;i++)
            v.push_back(v2[i]);
        if(connected({v1[l1]},v))
            r2=mid;
        else
            l2=mid;
    }
    
    return{v1[l1],v2[l2]};
}

vector<int>merge(vector<int>v1,vector<int>v2){
    while(v2.size()){
        v1.push_back(v2.back());
        v2.pop_back();
    }
    return v1;
}

bool is_unc(int a,int b){
    return uncs.count({a,b});
}

pair<vector<int>,vector<int>>merge(vector<int>v1,vector<int>v2,vector<int>v3){
    int num=is_unc(v1.back(),v2.back())+is_unc(v1.back(),v3.back())+is_unc(v2.back(),v3.back());
    if(num==2){
        if(!is_unc(v1.back(),v2.back()))
            return{merge(v1,v2),v3};
        if(!is_unc(v2.back(),v3.back()))
            return{merge(v3,v2),v1};
        if(!is_unc(v1.back(),v3.back()))
            return{merge(v1,v3),v2};
    }
    
    if(connected(v1.back(),v2.back()))
        return{merge(v1,v2),v3};
    if(is_unc(v1.back(),v3.back())||connected(v2.back(),v3.back()))
        return{merge(v2,v3),v1};
    
    return{merge(v1,v3),v2};
}

vector<int>cyclic_shift(vector<int>arr,int a){
    // it ends with a
    vector<int>res;
    bool b1=false;
    for(int i:arr){
        if(b1)
            res.push_back(i);
        if(i==a)
            b1=true;
    }
    
    bool b2=true;
    for(int i:arr){
        if(b2)
            res.push_back(i);
        if(i==a)
            b2=false;
    }
    return res;
}

vector<int>longest_trip(int N,int D){
    miss=0;
    qc=0;
    uncs.clear();
    cache.clear();
    srand(635748);
    n=N;
    unc.clear();
    for(int i=0;i<n;i++)
        perm[i]=i;
    for(int i=0;i<n;i++)
        swap(perm[i],perm[rand()%n]);
    
    vector<int>arr1={0},arr2;
    for(int curr=1;curr<n;curr++){
        if(arr2.empty()){
            if(connected(curr,arr1.back()))
                arr1.push_back(curr);
            else
                arr2.push_back(curr);
        }else{
            if(connected(curr,arr1.back()))
                arr1.push_back(curr);
            else if(connected(curr,arr2.back()))
                arr2.push_back(curr);
            else{
                arr1=merge(arr1,arr2);
                arr2={curr};
            }
        }
    }
    
    //cout<<"MISSES: "<<miss<<"\n";
    
    
    vector<int>res1=arr1;
    vector<int>res2=arr2;
    
    if(res2.empty()||!connected(res1,res2)){
        if(res1.size()>res2.size())
            return per(res1);
        else
            return per(res2);
    }
    
    if(connected({res1.back(),res1[0]},{res2.back(),res2[0]})){
        if(connected(res1.back(),res2.back()))
            return per(merge(res1,res2));
        reverse(res1.begin(),res1.end());
        if(connected(res1.back(),res2.back()))
            return per(merge(res1,res2));
        reverse(res2.begin(),res2.end());
        if(connected(res1.back(),res2.back()))
            return per(merge(res1,res2));
        reverse(res1.begin(),res1.end());
        if(connected(res1.back(),res2.back()))
            return per(merge(res1,res2));
    }
    
    vector<bool>in_res1(n);
    for(int i:res1)
        in_res1[i]=true;
    
    // both must be cyclical then
    pair<int,int>pr={-1,-1};
    
    for(auto[u,v]:unc){
        if(in_res1[u]==in_res1[v]){
            if(in_res1[u]){
                if(connected(res2[0],u)){
                    pr={u,res2[0]};
                }else{
                    pr={v,res2[0]};
                }
            }else{
                if(connected(res1[0],u)){
                    pr={res1[0],u};
                }else{
                    pr={res1[0],v};
                }
            }
            break;
        }
    }
    
    if(pr.first==-1){
        //cout<<"FINDING\n";
        qc=0;
        pr=find_conn(res1,res2);
        //cout<<"FOUND IN "<<qc<<"\n";
    }
    
    vector<int>r1=cyclic_shift(res1,pr.first);
    vector<int>r2=cyclic_shift(res2,pr.second);
    return per(merge(r1,r2));
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 2 ms 444 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 344 KB Output is correct
2 Correct 6 ms 344 KB Output is correct
3 Correct 8 ms 344 KB Output is correct
4 Correct 7 ms 344 KB Output is correct
5 Correct 6 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 344 KB Output is correct
2 Correct 6 ms 344 KB Output is correct
3 Correct 6 ms 344 KB Output is correct
4 Correct 6 ms 440 KB Output is correct
5 Correct 6 ms 344 KB Output is correct
6 Correct 9 ms 344 KB Output is correct
7 Correct 7 ms 344 KB Output is correct
8 Correct 6 ms 344 KB Output is correct
9 Correct 8 ms 344 KB Output is correct
10 Correct 6 ms 600 KB Output is correct
11 Correct 8 ms 472 KB Output is correct
12 Correct 6 ms 456 KB Output is correct
13 Correct 7 ms 600 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 344 KB Output is correct
2 Correct 6 ms 344 KB Output is correct
3 Correct 7 ms 344 KB Output is correct
4 Correct 6 ms 348 KB Output is correct
5 Correct 8 ms 344 KB Output is correct
6 Correct 11 ms 344 KB Output is correct
7 Correct 7 ms 344 KB Output is correct
8 Correct 8 ms 344 KB Output is correct
9 Correct 8 ms 344 KB Output is correct
10 Correct 8 ms 472 KB Output is correct
11 Correct 8 ms 344 KB Output is correct
12 Correct 6 ms 344 KB Output is correct
13 Correct 6 ms 344 KB Output is correct
14 Correct 8 ms 344 KB Output is correct
15 Correct 8 ms 344 KB Output is correct
16 Correct 11 ms 344 KB Output is correct
17 Correct 8 ms 344 KB Output is correct
18 Correct 7 ms 344 KB Output is correct
19 Correct 7 ms 344 KB Output is correct
20 Correct 9 ms 344 KB Output is correct
21 Correct 6 ms 344 KB Output is correct
22 Correct 7 ms 344 KB Output is correct
23 Correct 7 ms 492 KB Output is correct
24 Correct 9 ms 868 KB Output is correct
25 Correct 11 ms 344 KB Output is correct
26 Correct 12 ms 344 KB Output is correct
27 Correct 7 ms 344 KB Output is correct
28 Correct 7 ms 344 KB Output is correct
29 Correct 9 ms 344 KB Output is correct
30 Correct 6 ms 344 KB Output is correct
31 Correct 7 ms 344 KB Output is correct
32 Correct 9 ms 344 KB Output is correct
33 Correct 7 ms 344 KB Output is correct
34 Correct 7 ms 344 KB Output is correct
35 Correct 7 ms 600 KB Output is correct
36 Correct 5 ms 344 KB Output is correct
37 Correct 6 ms 344 KB Output is correct
38 Correct 7 ms 344 KB Output is correct
39 Correct 13 ms 344 KB Output is correct
40 Correct 9 ms 856 KB Output is correct
41 Correct 8 ms 344 KB Output is correct
42 Correct 10 ms 344 KB Output is correct
43 Correct 7 ms 344 KB Output is correct
44 Correct 7 ms 468 KB Output is correct
45 Correct 13 ms 344 KB Output is correct
46 Correct 14 ms 344 KB Output is correct
47 Correct 8 ms 344 KB Output is correct
48 Correct 10 ms 344 KB Output is correct
49 Correct 11 ms 344 KB Output is correct
50 Correct 6 ms 344 KB Output is correct
51 Correct 8 ms 344 KB Output is correct
52 Correct 11 ms 344 KB Output is correct
53 Correct 5 ms 344 KB Output is correct
54 Correct 8 ms 600 KB Output is correct
55 Correct 7 ms 344 KB Output is correct
56 Correct 6 ms 344 KB Output is correct
57 Correct 6 ms 344 KB Output is correct
58 Correct 8 ms 472 KB Output is correct
59 Correct 9 ms 344 KB Output is correct
60 Correct 9 ms 492 KB Output is correct
61 Correct 9 ms 344 KB Output is correct
62 Correct 9 ms 340 KB Output is correct
63 Correct 9 ms 344 KB Output is correct
64 Correct 10 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 344 KB Output is correct
2 Correct 6 ms 344 KB Output is correct
3 Correct 6 ms 344 KB Output is correct
4 Correct 6 ms 344 KB Output is correct
5 Correct 5 ms 344 KB Output is correct
6 Correct 9 ms 344 KB Output is correct
7 Correct 7 ms 344 KB Output is correct
8 Correct 6 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 6 ms 344 KB Output is correct
12 Correct 7 ms 456 KB Output is correct
13 Correct 6 ms 344 KB Output is correct
14 Correct 8 ms 340 KB Output is correct
15 Correct 8 ms 344 KB Output is correct
16 Correct 10 ms 344 KB Output is correct
17 Correct 7 ms 344 KB Output is correct
18 Correct 7 ms 344 KB Output is correct
19 Correct 7 ms 600 KB Output is correct
20 Correct 7 ms 468 KB Output is correct
21 Correct 8 ms 344 KB Output is correct
22 Correct 10 ms 340 KB Output is correct
23 Correct 7 ms 344 KB Output is correct
24 Correct 7 ms 344 KB Output is correct
25 Correct 7 ms 344 KB Output is correct
26 Correct 7 ms 340 KB Output is correct
27 Correct 8 ms 344 KB Output is correct
28 Correct 11 ms 944 KB Output is correct
29 Correct 7 ms 344 KB Output is correct
30 Correct 6 ms 344 KB Output is correct
31 Correct 7 ms 464 KB Output is correct
32 Correct 9 ms 344 KB Output is correct
33 Correct 10 ms 344 KB Output is correct
34 Correct 8 ms 344 KB Output is correct
35 Correct 8 ms 344 KB Output is correct
36 Correct 8 ms 344 KB Output is correct
37 Correct 6 ms 344 KB Output is correct
38 Correct 12 ms 344 KB Output is correct
39 Correct 9 ms 344 KB Output is correct
40 Correct 7 ms 604 KB Output is correct
41 Correct 7 ms 344 KB Output is correct
42 Correct 7 ms 344 KB Output is correct
43 Correct 9 ms 344 KB Output is correct
44 Correct 7 ms 488 KB Output is correct
45 Correct 10 ms 344 KB Output is correct
46 Correct 6 ms 344 KB Output is correct
47 Correct 6 ms 344 KB Output is correct
48 Correct 7 ms 460 KB Output is correct
49 Partially correct 11 ms 344 KB Output is partially correct
50 Partially correct 13 ms 344 KB Output is partially correct
51 Correct 8 ms 344 KB Output is correct
52 Correct 9 ms 344 KB Output is correct
53 Correct 8 ms 344 KB Output is correct
54 Correct 9 ms 344 KB Output is correct
55 Correct 10 ms 344 KB Output is correct
56 Correct 8 ms 344 KB Output is correct
57 Correct 7 ms 344 KB Output is correct
58 Correct 7 ms 600 KB Output is correct
59 Partially correct 9 ms 344 KB Output is partially correct
60 Correct 9 ms 344 KB Output is correct
61 Correct 9 ms 472 KB Output is correct
62 Correct 7 ms 344 KB Output is correct
63 Correct 6 ms 344 KB Output is correct
64 Partially correct 8 ms 344 KB Output is partially correct
65 Partially correct 11 ms 344 KB Output is partially correct
66 Partially correct 9 ms 344 KB Output is partially correct
67 Correct 12 ms 344 KB Output is correct
68 Correct 11 ms 344 KB Output is correct
69 Partially correct 9 ms 340 KB Output is partially correct
70 Partially correct 9 ms 344 KB Output is partially correct
71 Correct 9 ms 476 KB Output is correct
72 Correct 8 ms 344 KB Output is correct
73 Partially correct 11 ms 600 KB Output is partially correct
74 Partially correct 9 ms 492 KB Output is partially correct
75 Correct 13 ms 344 KB Output is correct
76 Correct 9 ms 600 KB Output is correct
77 Correct 7 ms 344 KB Output is correct
78 Partially correct 9 ms 452 KB Output is partially correct
79 Partially correct 9 ms 344 KB Output is partially correct
80 Partially correct 9 ms 344 KB Output is partially correct
81 Correct 12 ms 456 KB Output is correct
82 Correct 11 ms 344 KB Output is correct