Submission #1069005

#TimeUsernameProblemLanguageResultExecution timeMemory
1069005MalixLongest Trip (IOI23_longesttrip)C++17
85 / 100
16 ms692 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){ a.clear();b.clear(); a.PB(x.back());b.PB(pos); bool f1=are_connected(a,b); a.clear();b.clear(); a.PB(y.back());b.PB(pos); bool f2=are_connected(a,b); if(f1&&f2){ x.PB(pos); reverse(y.begin(),y.end()); for(auto u:y)x.PB(u); y.clear(); int tmp=solve(x.back(),pos+1,n); REP(i,pos+1,tmp)x.PB(i); if(tmp==n)return x; y.PB(tmp); pos=tmp+1; } else if(f1){ x.PB(pos); pos++; } else if(f2){ y.PB(pos); pos++; } else{ reverse(y.begin(),y.end()); for(auto u:y)x.PB(u); y.clear(); int tmp=solve(x.back(),pos,n); REP(i,pos,tmp)x.PB(i); if(tmp==n)return x; y.PB(tmp); pos=tmp+1; } } if(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(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; }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:136:16: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  136 |     if(x.size()==n)return x;
      |        ~~~~~~~~^~~
#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...