Submission #1060289

#TimeUsernameProblemLanguageResultExecution timeMemory
1060289Huseyn123Longest Trip (IOI23_longesttrip)C++17
15 / 100
7 ms448 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; vector<int> a,b,c; bool f(int x,int l,int r){ vector<int> d; for(int i=l;i<=r;i++){ d.push_back(b[i]); } if((int)d.size()==0){ return false; } return are_connected({a[x]},d); } vector<int> longest_trip(int N, int D){ a.clear(); b.clear(); c.clear(); vector<int> res; if(D==3){ for(int i=0;i<N;i++){ res.push_back(i); } } else if(D==2){ set<int> c; for(int i=1;i<N;i++){ c.insert(i); } res.push_back(0); for(int i=0;i<N-1;i++){ auto it=c.begin(); if(are_connected({res.back()},{*it})){ res.push_back(*it); } else{ ++it; if(it==c.end()){ reverse(res.begin(),res.end()); --it; res.push_back(*it); } else{ res.push_back(*it); } } c.erase(*it); } } else{ a.push_back(0); b.push_back(1); for(int i=2;i<N;i++){ bool ok1=are_connected({a.back()},{i}); bool ok2=true; if((int)b.size()>0){ ok2=are_connected({b.back()},{i}); } if(ok1 && ok2){ reverse(b.begin(),b.end()); a.push_back(i); for(auto x:b){ a.push_back(x); } b.clear(); } else if(ok1){ a.push_back(i); } else if(ok2){ b.push_back(i); } else{ reverse(b.begin(),b.end()); for(auto x:b){ a.push_back(x); } b.clear(); b.push_back(i); } } for(int i=0;i<(int)a.size();i++){ int sz=(int)b.size(); int sz1=(int)a.size(); int l,r,mid; l=0; r=sz-1; while(l<r){ mid=(l+r+1)/2; if(f(i,mid,sz-1)){ l=mid; } else{ r=mid-1; } } if(f(i,l,sz-1) && l+1+max(i+1,sz1-i)>(int)c.size()){ c.clear(); for(int j=0;j<=l;j++){ c.push_back(b[j]); } if(i+1>sz1-i){ for(int j=i;j>=0;j--){ c.push_back(a[j]); } } else{ for(int j=i;j<sz1;j++){ c.push_back(a[j]); } } } l=0; r=sz-1; while(l<r){ mid=(l+r)/2; if(f(i,0,mid)){ r=mid; } else{ l=mid+1; } } if(f(i,0,l) && sz-l+max(i+1,sz1-i)>(int)c.size()){ c.clear(); for(int j=sz-1;j>=l;j--){ c.push_back(b[j]); } if(i+1>sz1-i){ for(int j=i;j>=0;j--){ c.push_back(a[j]); } } else{ for(int j=i;j<sz1;j++){ c.push_back(a[j]); } } } } if((int)a.size()>(int)b.size()){ res=a; } else{ res=b; } if((int)c.size()>(int)res.size()){ res=c; } } return res; }
#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...