Submission #1132959

#TimeUsernameProblemLanguageResultExecution timeMemory
1132959StefanSebezStations (IOI20_stations)C++20
5 / 100
307 ms2908 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double const int N=1e5+50,M=1000; vector<int>E[N]; int in[N],out[N],depth[N],nc=-1; void DFS(int u,int parent=0){ depth[u]=depth[parent]+1; if(depth[u]%2==1) in[u]=++nc; else in[u]=nc; for(auto i:E[u]){ if(i!=parent) DFS(i,u); } if(depth[u]%2==0) out[u]=++nc; else out[u]=nc; } std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v){ for(int i=0;i<n-1;i++){ E[u[i]].pb(v[i]); E[v[i]].pb(u[i]); } int root=0;for(int i=0;i<n;i++) if(E[i].size()==1) root=i; DFS(root,root); //for(int i=0;i<n;i++) printf("%i ",depth[i]);printf("\n"); vector<int>lbl; for(int i=0;i<n;i++){ //lbl.pb(in[i]+M*out[i]); if(depth[i]%2==1) lbl.pb(in[i]); else lbl.pb(out[i]); } //for(int i=0;i<n;i++) printf("%i: %i %i %i\n",i,depth[i],in[i],out[i]); //for(auto i:lbl) cerr<<i<<" ";cerr<<endl; for(int i=0;i<=n;i++) E[i].clear(),in[i]=out[i]=depth[i]=0,nc=-1; return lbl; } /*int IN(int x){return x%M;} int OUT(int x){return x/M;} bool Podstablo(int x,int y){if(IN(x)<=IN(y)&&IN(y)<=OUT(x))return true;return false;}*/ int find_next_station(int s, int t, std::vector<int> c){ /*int res=c[0]; if(s<t){ for(int i=0;i<c.size();i++){ int u=c[i]; if(u>s) res=u; } } else{ for(int i=0;i<c.size();i++){ int u=c[i]; if(u<s) res=u; } }*/ /*int res=c[0]; if(Podstablo(s,t)){ for(auto i:c){ if(Podstablo(i,t)&&!Podstablo(i,s)) res=i; } } else{ for(auto i:c){ if(Podstablo(i,s)) res=i; } }*/ int res=-1,k=c.size(),In[k+10],Out[k+10],I,O; if(k==1) return c[0]; for(auto i:c) if(i==t) return i; if(s<=c[0]){ I=s;k--; for(int i=0;i<k;i++) Out[i]=c[i]; O=Out[k-1]; //In[0]=I+1; //for(int i=1;i<k;i++) In[i]=Out[i-1]+1; if(I<=t&&t<=O){ for(int i=0;i<k;i++) if(t<=Out[i]) res=c[i]; } else res=c[k]; } else{ O=s; for(int i=1;i<k;i++) In[i]=c[i]; I=In[1]; //cerr<<I<<" "<<O<<" "<<t<<endl; //Out[k-1]=O-1; //for(int i=k-2;i>=1;i--) Out[i]=In[i+1]-1; if(I<=t&&t<=O){ for(int i=1;i<k;i++) if(In[i]<=t){res=c[i];break;} } else res=c[0]; } return res; }
#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...