Submission #1069040

#TimeUsernameProblemLanguageResultExecution timeMemory
1069040MalixLongest Trip (IOI23_longesttrip)C++17
100 / 100
14 ms600 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vii; typedef pair<int,int> pi; typedef vector<pi> pii; typedef tuple<int,int,int> tii; typedef vector<ll> li; typedef vector<li> lii; #define REP(i,a,b) for(int i=a;i<b;i++) #define F first #define S second #define PB push_back #define MP make_pair #define LSOne(s) ((s)&(-s)) ll INF=1e18+10; int inf=1e9+10; ll M=1e9+7; int solve(int bk,int p,int n){ vi a,b,x; x.PB(bk); REP(i,p,n){ a.clear(); a.PB(x.back()); b.clear(); b.PB(i); if(are_connected(a,b))x.PB(i); else return i; } return n; } pi BS(int l,int r,int x,int y,vi &arr,vi &brr){ if(l==r&&x==y)return {l,x}; int m=(l+r)/2; int z=(x+y)/2; vi a,b; REP(i,l,m+1)a.PB(arr[i]); REP(i,x,y+1)b.PB(brr[i]); if(are_connected(a,b))r=m; else l=m+1; a.clear();b.clear(); REP(i,l,r+1)a.PB(arr[i]); REP(i,x,z+1)b.PB(brr[i]); if(are_connected(a,b))y=z; else x=z+1; return BS(l,r,x,y,arr,brr); } std::vector<int> longest_trip(int n, int d) { if(d==3){ vi ans; REP(i,0,n)ans.PB(i); return ans; } if(d==2){ deque<int> dq; vi a,b; a.PB(0);b.PB(1); if(are_connected(a,b)){ dq.PB(0); dq.PB(1); b.pop_back();b.PB(2); if(are_connected(a,b))dq.push_front(2); else dq.push_back(2); } else{ dq.PB(0); dq.PB(2); dq.PB(1); } REP(i,3,n){ a.clear();b.clear(); a.PB(dq.back());b.PB(i); if(are_connected(a,b))dq.push_back(i); else dq.push_front(i); } vi ans; REP(i,0,n){ ans.PB(dq.front()); dq.pop_front(); } return ans; } vi a,b,x,y; x.PB(0); int tm=solve(0,1,n); REP(i,1,tm)x.PB(i); if(tm!=n)y.PB(tm); if(y.empty())return x; int pos=tm+1; while(pos<n-1){ a.clear();b.clear(); a.PB(x.back());b.PB(pos); if(are_connected(a,b)){ a.clear();b.clear(); a.PB(y.back());b.PB(pos+1); if(are_connected(a,b)){ x.PB(pos); y.PB(pos+1); a.clear();b.clear(); a.PB(pos);b.PB(pos+1); if(are_connected(a,b)){ reverse(y.begin(),y.end()); for(auto u:y)x.PB(u); y.clear(); int tmp=solve(x.back(),pos+2,n); REP(i,pos+2,tmp)x.PB(i); if(tmp==n)return x; y.PB(tmp); pos=tmp+1; } else pos+=2; } else{ a.clear();b.clear(); a.PB(pos);b.PB(pos+1); if(are_connected(a,b)){ x.PB(pos); x.PB(pos+1); pos+=2; } else{ x.PB(pos+1); y.PB(pos); pos+=2; } } } else{ y.PB(pos);pos++; } } if(pos<n){ a.clear();b.clear(); a.PB(pos);b.PB(x.back()); if(are_connected(a,b))x.PB(pos); else y.PB(pos); } if((int)x.size()==n)return x; if(!are_connected(x,y)){ if(x.size()>=y.size())return x; else return y; } a.clear();b.clear(); a.PB(x.front());b.PB(y.front()); if(x.size()!=1)a.PB(x.back()); if(y.size()!=1)b.PB(y.back()); if(are_connected(a,b)){ a.clear();b.clear(); a.PB(x.front());b.PB(y.front()); if(are_connected(a,b)){ reverse(x.begin(),x.end()); for(auto u:y)x.PB(u); return x; } a.clear();b.clear(); a.PB(x.front());b.PB(y.back()); if(are_connected(a,b)){ reverse(x.begin(),x.end()); reverse(y.begin(),y.end()); for(auto u:y)x.PB(u); return x; } a.clear();b.clear(); a.PB(x.back());b.PB(y.front()); if(are_connected(a,b)){ for(auto u:y)x.PB(u); return x; } a.clear();b.clear(); a.PB(x.back());b.PB(y.back()); if(are_connected(a,b)){ reverse(y.begin(),y.end()); for(auto u:y)x.PB(u); return x; } } int s1=x.size(),s2=y.size(); pi arr=BS(0,s1-1,0,s2-1,x,y); vi ans; REP(k,arr.F+1,s1)ans.PB(x[k]); REP(k,0,arr.F+1)ans.PB(x[k]); REP(k,arr.S,s2)ans.PB(y[k]); REP(k,0,arr.S)ans.PB(y[k]); return ans; }
#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...