제출 #906728

#제출 시각아이디문제언어결과실행 시간메모리
906728NemanjaSo2005즐거운 행로 (APIO20_fun)C++17
100 / 100
194 ms21196 KiB
#include "fun.h"
int N;
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;
int root,depth[maxn];
int odakle;
vector<int> R,koji[5];
vector<int> V;
bool podub(int a,int b){
   return depth[a]<depth[b];
}
void findroot(){
   root=1;
   for(int i=2;i<=N;i++)
      if(attractionsBehind(root-1,i-1)>=(N)/2+1)
         root=i;
   return;
}
void finddepth(){
   for(int i=1;i<=N;i++){
      depth[i]=hoursRequired(root-1,i-1);
    //  cout<<i<<" dubina "<<depth[i]<<endl;
      if(depth[i]==1)
         R.push_back(i);
   }
   return;
}
bool insubtree(int a,int b){
   //cout<<a<<" "<<b<<" "<<attractionsBehind(a-1,b-1)<<endl;
   return attractionsBehind(a-1,b-1)>=(N)/2+1;
}
void findsubtree(){
   for(int i=1;i<=N;i++){
      if(depth[i]==0)
         continue;
      if(insubtree(i,R[0]))
         koji[0].push_back(i);
      else if(insubtree(i,R[1]))
         koji[1].push_back(i);
      else
         koji[2].push_back(i);
   }
}
int dist(int a,int b){
   return depth[a]+depth[b];
}
void dodaj(int idx){
   if(koji[idx].size()==0)
      return;
   odakle=idx;
   //cout<<idx<<" "<<koji[idx].back()<<endl;
   V.push_back(koji[idx].back());
   koji[idx].pop_back();
   //cout<<"DODAJEM "<<idx<<" "<<depth[V.back()]<<endl;
   return;
}
void spoj(int a,int b){
   //cout<<"SPAJAM "<<a<<" "<<b<<endl;
   //cout<<V.size()<<" "<<odakle<<endl;
   if(a>b)
      swap(a,b);
   int c=a^b^3;
 
   if(odakle!=c)
      if(dist(V.back(),koji[c].back())<dist(koji[c].back(),koji[3^c^odakle].back()))
         dodaj(3^odakle^c);
 
   for(int i=0;i<koji[b].size();i++)
      koji[a].push_back(koji[b][i]);
 
   sort(koji[a].begin(),koji[a].end(),podub);
   if(odakle==b)
      odakle=a;
   if(b==1){
      koji[1]=koji[2];
      if(odakle==2)
         odakle=1;
   }
   koji[2].clear();
 
   //cout<<odakle<<endl;
   //cout<<V.size()<<endl;
}
vector<int> createFunTour(int n, int Q) {
   N=n;
   findroot();
   finddepth();
   findsubtree();
   for(int i=0;i<=2;i++)
      if(koji[i].size())
         sort(koji[i].begin(),koji[i].end(),podub);
   if(koji[2].size()){
      if(depth[koji[0].back()]>=depth[koji[1].back()] and depth[koji[0].back()]>=depth[koji[2].back()])
         dodaj(0);
      else if(depth[koji[1].back()]>=depth[koji[0].back()] and depth[koji[1].back()]>=depth[koji[2].back()])
         dodaj(1);
      else
         dodaj(2);
   }
   else
      if(koji[1].size()>koji[0].size())
         dodaj(1);
      else
         dodaj(0);
 
   while(koji[2].size()){

      if(koji[0].size()+koji[1].size()<=koji[2].size()){
         spoj(0,1);
         break;
      }
      if(koji[0].size()+koji[2].size()<=koji[1].size()){
         spoj(0,2);
         break;
      }
      if(koji[1].size()+koji[2].size()<=koji[0].size()){
         spoj(1,2);
         break;
      }
      int nd=0;
      if(odakle==0)
         nd=1;
      for(int i=1;i<=2;i++)
         if(depth[koji[i].back()]>depth[koji[nd].back()] and i!=odakle)
            nd=i;
      dodaj(nd);
   }
  // cout<<"BBB"<<endl;
   //cout<<odakle<<endl;
   //cout<<koji[0].size()<<" "<<koji[1].size()<<" "<<koji[2].size()<<endl;
   for(int it=1;it<=N;it++)
      dodaj(odakle^1);
   while(koji[0].size()){
      V.push_back(koji[0].back());
      koji[0].pop_back();
   }
   //cout<<"CCC"<<endl;
   while(koji[1].size()){
      V.push_back(koji[1].back());
      koji[1].pop_back();
   }
   //cout<<"ROOT JE "<<root<<endl;
   V.push_back(root);
   for(int i=0;i<V.size();i++)
      V[i]--;
   return V;}

컴파일 시 표준 에러 (stderr) 메시지

fun.cpp: In function 'void spoj(int, int)':
fun.cpp:70:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |    for(int i=0;i<koji[b].size();i++)
      |                ~^~~~~~~~~~~~~~~
fun.cpp: In function 'std::vector<int> createFunTour(int, int)':
fun.cpp:146:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |    for(int i=0;i<V.size();i++)
      |                ~^~~~~~~~~
#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...