제출 #1132959

#제출 시각아이디문제언어결과실행 시간메모리
1132959StefanSebez기지국 (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...