Submission #840763

#TimeUsernameProblemLanguageResultExecution timeMemory
840763firewaterLongest Trip (IOI23_longesttrip)C++17
100 / 100
21 ms2824 KiB
#include<bits/stdc++.h> #include "longesttrip.h" #define MX 100100 using namespace std; int n,now,x,y,z,xx,yy,gg,zz,to[MX]; vector<int>A,B,ans,ans1,ans2,a[MX]; // queue<int>d; // bool are_connected(std::vector<int> A, std::vector<int> B) bool check(int x,int y) { A.clear();B.clear(); A.push_back(x); B.push_back(y); return are_connected(A,B); } bool checkk(int x,vector<int> G) { A.clear(); A.push_back(x); return are_connected(A,G); } bool checkkk(int x,vector<int> G) { A.clear(); for(int i=0;i<=x;++i) A.push_back(ans1[i]); return are_connected(A,G); } bool checkkkk(int x,int y) { A.clear(); A.push_back(x); B.clear(); for(int i=0;i<=y;++i) B.push_back(ans2[i]); return are_connected(A,B); } void dfs(int x,int fa) { ans1.push_back(x); for(int i=0;i<a[x].size();++i) if(a[x][i]!=fa) dfs(a[x][i],x); return; } void dfss(int x,int fa) { ans2.push_back(x); for(int i=0;i<a[x].size();++i) if(a[x][i]!=fa) dfss(a[x][i],x); return; } mt19937 gy(2018729); int rd(int l,int r) { return gy()%(r-l+1)+l; } std::vector<int> longest_trip(int N, int D) { n=N; for(int i=0;i<n;++i) a[i].clear(); x=0; to[x]=x; y=1; to[y]=y; gg=0; for(int i=2;i<n;++i){ z=i; to[z]=z; if(check(x,z)){ a[x].push_back(z); a[z].push_back(x); xx=to[x]; zz=to[z]; to[xx]=zz; to[zz]=xx; x=z; gg=0; } else if(!gg&&check(x,y)){ a[x].push_back(y); a[y].push_back(x); xx=to[x]; yy=to[y]; to[xx]=yy; to[yy]=xx; x=xx;y=z; gg=0; } else { a[y].push_back(z); a[z].push_back(y); yy=to[y]; zz=to[z]; to[yy]=zz; to[zz]=yy; y=z; gg=1; } } ans1.clear(); ans2.clear(); ans.clear(); dfs(x,x); dfss(y,y); if(!are_connected(ans1,ans2)){ if(ans1.size()>ans2.size())return ans1; else return ans2; } xx=to[x]; yy=to[y]; A.clear(); B.clear(); A.push_back(x); if(x!=xx)A.push_back(xx); B.push_back(y); if(y!=yy)B.push_back(yy); if(are_connected(A,B)){ if(check(x,y)){ for(int i=ans1.size()-1;i>=0;--i) ans.push_back(ans1[i]); for(int i=0;i<ans2.size();++i) ans.push_back(ans2[i]); } else if(check(x,yy)){ for(int i=ans1.size()-1;i>=0;--i) ans.push_back(ans1[i]); for(int i=ans2.size()-1;i>=0;--i) ans.push_back(ans2[i]); } else if(check(xx,y)){ for(int i=0;i<ans1.size();++i) ans.push_back(ans1[i]); for(int i=0;i<ans2.size();++i) ans.push_back(ans2[i]); } else if(check(xx,yy)){ for(int i=0;i<ans1.size();++i) ans.push_back(ans1[i]); for(int i=ans2.size()-1;i>=0;--i) ans.push_back(ans2[i]); } } else{ int l=0,r=ans1.size()-1; while(l<r){ int mid=l+r>>1; if(checkkk(mid,ans2))r=mid; else l=mid+1; } int sav=l; l=0;r=ans2.size()-1; while(l<r){ int mid=l+r>>1; if(checkkkk(ans1[sav],mid))r=mid; else l=mid+1; } int i=sav,j=l; for(int k=i+1;k<ans1.size();++k) ans.push_back(ans1[k]); for(int k=0;k<=i;++k) ans.push_back(ans1[k]); for(int k=j;k<ans2.size();++k) ans.push_back(ans2[k]); for(int k=0;k<j;++k) ans.push_back(ans2[k]); return ans; } return ans; }

Compilation message (stderr)

longesttrip.cpp: In function 'void dfs(int, int)':
longesttrip.cpp:42:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |     for(int i=0;i<a[x].size();++i)
      |                 ~^~~~~~~~~~~~
longesttrip.cpp: In function 'void dfss(int, int)':
longesttrip.cpp:50:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for(int i=0;i<a[x].size();++i)
      |                 ~^~~~~~~~~~~~
longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:126:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |             for(int i=0;i<ans2.size();++i)
      |                         ~^~~~~~~~~~~~
longesttrip.cpp:136:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |             for(int i=0;i<ans1.size();++i)
      |                         ~^~~~~~~~~~~~
longesttrip.cpp:138:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |             for(int i=0;i<ans2.size();++i)
      |                         ~^~~~~~~~~~~~
longesttrip.cpp:142:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  142 |             for(int i=0;i<ans1.size();++i)
      |                         ~^~~~~~~~~~~~
longesttrip.cpp:151:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  151 |             int mid=l+r>>1;
      |                     ~^~
longesttrip.cpp:158:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  158 |             int mid=l+r>>1;
      |                     ~^~
longesttrip.cpp:163:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  163 |                for(int k=i+1;k<ans1.size();++k)
      |                              ~^~~~~~~~~~~~
longesttrip.cpp:167:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  167 |                for(int k=j;k<ans2.size();++k)
      |                            ~^~~~~~~~~~~~
#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...