제출 #1132395

#제출 시각아이디문제언어결과실행 시간메모리
1132395StefanSebez기지국 (IOI20_stations)C++20
0 / 100
308 ms2884 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],nc=-1;
void DFS(int u,int parent=-1){
    in[u]=++nc;
    for(auto i:E[u]){
        if(i!=parent) DFS(i,u);
    }
    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;DFS(root);
    vector<int>lbl;for(int i=0;i<n;i++) lbl.pb(in[i]+M*out[i]);
    for(int i=0;i<=n;i++) E[i].clear(),in[i]=out[i]=0,nc=-1;
    return lbl;*/
    int root=0;
    for(int i=0;i<n;i++) if(E[i].size()==2) root=i;
    int num[n+10]={0},ct=1;
    queue<int>kju;kju.push(root);
    num[root]=1;
    while(!kju.empty()){
        int u=kju.front();kju.pop();
        for(int I=0;I<E[u].size();I++){
            int i=E[u][I];
            if(num[i]) continue;
            num[i]=++ct;
            kju.push(i);
        }
    }
    //for(int i=0;i<n;i++) printf("%i ",num[i]);printf("\n");
    vector<int>lbl;for(int i=0;i<n;i++) lbl.pb(num[i]);
    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=c[0];
    vector<int>bits[2];
    int temp=s;while(temp) bits[0].pb(temp&1),temp>>=1;
    temp=t;while(temp) bits[1].pb(temp&1),temp>>=1;
    reverse(bits[0].begin(),bits[0].end());
    reverse(bits[1].begin(),bits[1].end());
    //printf("%i: ",s);for(auto i:bits[0]) printf("%i",i);printf("\n");
    //printf("%i: ",t);for(auto i:bits[1]) printf("%i",i);printf("\n");
    if(bits[1].size()<=bits[0].size()){
        for(auto i:c){
            if(i<s) res=i;
        }
    }
    else{
        bool bul=false;
        for(int i=0;i<bits[0].size();i++) if(bits[0][i]!=bits[1][i]) bul=true;
        if(bul==true){
            for(auto i:c){
                if(i<s) res=i;
            }
        }
        else{
            int bit=bits[1][bits[0].size()];
            //cerr<<bit<<endl;
            for(auto i:c){
                if(i>s&&((i&1)==bit)) res=i;
            }
        }
    }
    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...