제출 #1154347

#제출 시각아이디문제언어결과실행 시간메모리
1154347modwwe가장 긴 여행 (IOI23_longesttrip)C++20
100 / 100
6 ms436 KiB
#include "longesttrip.h" #include<bits/stdc++.h> /*#include <cassert> #include <cstdio> #include <string> #include <vector>*/ 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; }*/ #define pb push_back int n, m, s1, s2, s4, s3, sf, k, s5, s6, mx, s7, s8, s9, mx2, res, dem2 = 0, dem = 0, s33, dem3, dem4, mid, l2, r2, center; int i, s10, s12,k1,k2,k3,s11,lim,w,l,r ; int kk; int t; int el = 19; vector<int> v,v2; vector<int> cvc(vector<int>&v,int l,int r) { vector<int> haha(v.begin()+l,v.begin()+r+1); return haha; } vector<int> longest_trip(int N,int D) { n=N; m=D; v.clear(); v2.clear(); v.pb(0); v2.pb(1); bool de=0; for(int i=2; i<n; i++) { if(are_connected({v.back()}, {i})) { v.pb(i),de=0; } else if(de||are_connected({v2.back()}, {i})) { v2.pb(i); de=1; } else { reverse(v2.begin(),v2.end()); for(auto x:v2)v.pb(x); v2.clear(); v2.pb(i); de=0; } } if(are_connected(v,v2)) { l=1; r=v.size()-1; while(l<=r) { int mid=l+r>>1; vector<int> haha=cvc(v,mid,v.size()-1); if(are_connected(v2,haha))l=mid+1; else r=mid-1; } // debug s2=l-1; l=1; r=v2.size()-1; while(l<=r) { int mid=l+r>>1; vector<int> haha=cvc(v2,mid,v2.size()-1); if(are_connected({v[s2]},haha))l=mid+1; else r=mid-1; } s3=l-1; if(are_connected({v[0]}, {v2[0]})) { reverse(v.begin(),v.end()); for(auto x:v2)v.pb(x); return v; } if(are_connected({v[0]}, {v2.back()})) { reverse(v.begin(),v.end()); reverse(v2.begin(),v2.end()); for(auto x:v2)v.pb(x); return v; } if(are_connected({v.back()}, {v2.back()})) { ///reverse(v.begin(),v.end()); reverse(v2.begin(),v2.end()); for(auto x:v2)v.pb(x); return v; } if(are_connected({v.back()}, {v2[0]})) { ///reverse(v.begin(),v.end()); /// reverse(v2.begin(),v2.end()); for(auto x:v2)v.pb(x); return v; } if(are_connected({v[s2]}, {v2[0]})) { vector<int> ans; for(int i=s2+1; i<v.size(); i++)ans.pb(v[i]); for(int i=0; i<=s2; i++)ans.pb(v[i]); for(auto x:v2)ans.pb(x); return ans; } if(are_connected({v[0]}, {v2[s3]})) { reverse(v.begin(),v.end()); for(int i=s3; i<v2.size(); i++)v.pb(v2[i]); for(int i=0; i<s3; i++)v.pb(v2[i]); return v; } vector<int> ans; for(int i=s2+1; i<v.size(); i++)ans.pb(v[i]); for(int i=0; i<=s2; i++)ans.pb(v[i]); for(int i=s3; i<v2.size(); i++)ans.pb(v2[i]); for(int i=0; i<s3; i++)ans.pb(v2[i]); return ans; } else { if(v.size()>v2.size()) return v; return v2; } } /* int main() { freopen("test.inp","r",stdin); freopen("test.out","w",stdout); 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]); if(i!=l-1){ s2=min(t[i],t[i+1]); s3=max(t[i],t[i+1]); if(U[s3][s2]!=1)assert(0); } } printf("\n"); printf("%d\n", call_counter); maximumCalls = std::max(maximumCalls, call_counter); call_counter = 0; } printf("%d\n", maximumCalls); return 0; }*/
#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...