Submission #1145471

#TimeUsernameProblemLanguageResultExecution timeMemory
1145471AlgorithmWarriorLongest Trip (IOI23_longesttrip)C++20
Compilation error
0 ms0 KiB
#include "longesttrip.h" #include <cassert> #include <cstdio> #include <string> #include <vector> #include <deque> #include <bits/stdc++.h> using namespace std; static inline constexpr int maxNumberOfCalls = 32640; static inline constexpr int maxTotalNumberOfCalls = 150000; static inline constexpr int maxTotalNumberOfLandmarksInCalls = 1500000; static int call_counter = 0; static int total_call_counter = 0; static int landmark_counter = 0; static int C, N, D; static std::vector<std::vector<int>> U; static std::vector<bool> present; static inline void protocol_violation(std::string message) { printf("Protocol Violation: %s\n", message.c_str()); exit(0); } bool are_connected(std::vector<int> A, std::vector<int> B) { ++call_counter; ++total_call_counter; if (call_counter > maxNumberOfCalls || total_call_counter > maxTotalNumberOfCalls) { protocol_violation("too many calls"); } int nA = A.size(), nB = B.size(); landmark_counter += nA + nB; if (landmark_counter > maxTotalNumberOfLandmarksInCalls) { protocol_violation("too many elements"); } if (nA == 0 || nB == 0) { protocol_violation("invalid array"); } for (int i = 0; i < nA; ++i) { if (A[i] < 0 || N <= A[i]) { protocol_violation("invalid array"); } if (present[A[i]]) { protocol_violation("invalid array"); } present[A[i]] = true; } for (int i = 0; i < nA; ++i) { present[A[i]] = false; } for (int i = 0; i < nB; ++i) { if (B[i] < 0 || N <= B[i]) { protocol_violation("invalid array"); } if (present[B[i]]) { protocol_violation("invalid array"); } present[B[i]] = true; } for (int i = 0; i < nB; ++i) { present[B[i]] = false; } for (int i = 0; i < nA; ++i) { for (int j = 0; j < nB; ++j) { if (A[i] == B[j]) { protocol_violation("non-disjoint arrays"); } } } for (int i = 0; i < nA; ++i) { for (int j = 0; j < nB; ++j) { if (U[std::max(A[i], B[j])][std::min(A[i], B[j])] == 1) { return true; } } } return false; } vector<int>prefix(vector<int>v,int ind){ vector<int>pref; int i; for(i=0;i<=ind;++i) pref.push_back(v[i]); return pref; } vector<int>ocol(vector<int>v,int val){ int i; int poz=0; for(i=0;i<(int)v.size();++i) if(v[i]==val) poz=i; vector<int>ans; for(i=poz-1;i>=0;--i) ans.push_back(v[i]); for(i=v.size()-1;i>poz;--i) ans.push_back(v[i]); return ans; } std::vector<int> longest_trip(int N, int D){ if(D==3){ int i; vector<int>path; for(i=0;i<N;++i) path.push_back(i); return path; } else if(D==2){ int i; deque<int>path; int vec0; if(are_connected({0},{1})) vec0=1; else vec0=2; path.push_back(0); path.push_back(vec0); for(i=1;i<N;++i) if(i!=vec0){ if(are_connected({path.front()},{i})) path.push_front(i); else path.push_back(i); } vector<int>ans; for(auto el : path) ans.push_back(el); return ans; } else{ vector<int>unu,doi; int i; vector<int>perm; for(i=0;i<N;++i) perm.push_back(i); srand(time(0)); for(i=1;i<N;++i){ int sch=rand()%(i+1); swap(perm[i],perm[sch]); } unu.push_back(perm[0]); int ifor; for(ifor=1;ifor<N;++ifor){ i=perm[ifor]; if(doi.empty()){ if(are_connected({unu.back()},{i})) unu.push_back(i); else doi.push_back(i); } else{ if(rand()%2==0) swap(unu,doi); if(!are_connected({unu.back()},{i})) doi.push_back(i); else{ if(!are_connected({doi.back()},{i})) unu.push_back(i); else{ unu.push_back(i); reverse(doi.begin(),doi.end()); for(auto el : doi) unu.push_back(el); doi.clear(); } } } } if(doi.empty()) return unu; if(!are_connected(unu,doi)){ if(unu.size()<doi.size()) swap(unu,doi); return unu; } if(are_connected({unu.front()},{doi.front()})){ reverse(unu.begin(),unu.end()); for(auto el : doi) unu.push_back(el); return unu; } if(are_connected({unu.front()},{doi.back()})){ reverse(unu.begin(),unu.end()); reverse(doi.begin(),doi.end()); for(auto el : doi) unu.push_back(el); return unu; } if(are_connected({unu.back()},{doi.front()})){ for(auto el : doi) unu.push_back(el); return unu; } /// (] int st=-1,dr=unu.size()-1; while(dr-st>1){ int mij=(st+dr)/2; if(are_connected(prefix(unu,mij),doi)) dr=mij; else st=mij; } vector<int>unu_nod; unu_nod.push_back(unu[dr]); st=-1,dr=doi.size()-1; while(dr-st>1){ int mij=(st+dr)/2; if(are_connected(prefix(doi,mij),unu_nod)) dr=mij; else st=mij; } vector<int>rasp; vector<int>part; part=ocol(unu,unu_nod[0]); for(auto el : part) rasp.push_back(el); rasp.push_back(unu_nod[0]); rasp.push_back(doi[dr]); part=ocol(doi,doi[dr]); for(auto el : part) rasp.push_back(el); return rasp; } } int main() { assert(1 == scanf("%d", &C)); int maximumCalls = 0; for (int c = 0; c < C; ++c) { call_counter = 0; assert(2 == scanf("%d %d", &N, &D)); present.assign(N, false); U.resize(N); for (int i = 1; i < N; ++i) { U[i].resize(i); for (int j = 0; j < i; ++j) { assert(1 == scanf("%d", &U[i][j])); } } for (int i = 2; i < N; ++i) { for (int j = 1; j < i; ++j) { for (int k = 0; k < j; ++k) { if (U[i][j] + U[i][k] + U[j][k] < D) { printf("Insufficient Density\n"); exit(0); } } } } std::vector<int> t = longest_trip(N, D); int l = t.size(); printf("%d\n", l); for (int i = 0; i < l; ++i) { printf(i == 0 ? "%d" : " %d", t[i]); } printf("\n"); printf("%d\n", call_counter); maximumCalls = std::max(maximumCalls, call_counter); call_counter = 0; } printf("%d\n", maximumCalls); return 0; }

Compilation message (stderr)

/usr/bin/ld: /tmp/cclilGVa.o: in function `are_connected(std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)':
stub.cpp:(.text+0xd0): multiple definition of `are_connected(std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'; /tmp/ccQ9TwrW.o:longesttrip.cpp:(.text+0x30): first defined here
/usr/bin/ld: /tmp/cclilGVa.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccQ9TwrW.o:longesttrip.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status