Submission #1066034

#TimeUsernameProblemLanguageResultExecution timeMemory
1066034pccLongest Trip (IOI23_longesttrip)C++17
15 / 100
867 ms856 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; #define vi vector<int> const int mxn = 300; int ask(vector<int> a,vector<int> b){ return are_connected(a,b); } int dp[mxn][mxn]; bitset<mxn> vis; int N; int ask(int a,int b){ if(dp[a][b] != -1)return dp[a][b]; return ask(vector<int>({a}),vector<int>({b})); } void dfs(int now){ vis[now] = true; for(int i = 0;i<N;i++){ if(dp[now][i]&&!vis[i])dfs(i); } return; } vector<int> get_max_cc(){ //cerr<<"GETTING MAX CC: "<<endl; vector<int> heads; vis.reset(); for(int i = 0;i<N;i++){ if(!vis[i]){ heads.push_back(i); dfs(i); } } int ans = 0,tar = -1; for(auto &i:heads){ vis.reset(); dfs(i); if(vis.count()>ans){ ans = vis.count(); tar = i; } } assert(tar != -1); dfs(tar); vector<int> re; for(int i = 0;i<N;i++)if(vis[i])re.push_back(i); return re; } std::vector<int> longest_trip(int NN, int D){ N = NN; memset(dp,-1,sizeof(dp)); vis.reset(); for(int i = 0;i<N;i++){ dp[i][i] = 1; for(int j = i+1;j<N;j++)dp[i][j] = dp[j][i] = ask(i,j); } dfs(1); if(vis.count() != N){ return get_max_cc(); } deque<int> dq[2]; set<int> st; for(int i = 0;i<N;i++)st.insert(i); if(ask(0,1))dq[0] = {0,1}; else if(ask(1,2))dq[0] = {1,2}; else dq[0] = {0,2}; for(auto &i:dq[0])st.erase(i); while(st.size()){ if(dq[0].size()<dq[1].size())dq[0].swap(dq[1]); //cerr<<*st.begin()<<endl; auto now = *st.begin(); st.erase(now); if(ask(now,dq[0].back())){ dq[0].push_back(now); dq[0].swap(dq[1]); } else{ dq[1].push_back(now); } if(dq[0].empty()||dq[1].empty())continue; int s = dq[0].front(),t = dq[0].back(); if(!dp[s][t]){ if(dp[s][now]){ while(!dq[1].empty()){ dq[0].push_front(dq[1].back()); dq[1].pop_back(); } } else if(dp[t][now]){ while(!dq[1].empty()){ dq[0].push_back(dq[1].back()); dq[1].pop_back(); } } } else{ assert(dp[s][t]); int tar = -1; for(auto &i:dq[0]){ if(dp[i][now])tar = i; } if(tar == -1)continue; while(dq[0][0] != tar){ dq[0].push_back(dq[0][0]); dq[0].pop_front(); } while(!dq[1].empty()){ dq[0].push_front(dq[1].back()); dq[1].pop_back(); } } } if(dq[0].size()<dq[1].size())dq[0].swap(dq[1]); /* cerr<<"DQ: "<<endl; for(auto &i:dq[0])cerr<<i<<' ';cerr<<endl; for(auto &i:dq[1])cerr<<i<<' ';cerr<<endl; cerr<<endl; */ vector<int> ans; for(auto &i:dq[0])ans.push_back(i); return ans; }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> get_max_cc()':
longesttrip.cpp:44:17: warning: comparison of integer expressions of different signedness: 'std::size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   44 |   if(vis.count()>ans){
      |      ~~~~~~~~~~~^~~~
longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:65:17: warning: comparison of integer expressions of different signedness: 'std::size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   65 |  if(vis.count() != N){
      |     ~~~~~~~~~~~~^~~~
#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...