제출 #1301397

#제출 시각아이디문제언어결과실행 시간메모리
1301397jahongir철로 (IOI14_rail)C++20
100 / 100
46 ms728 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include "rail.h"
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define pb push_back

const int mxn = 5000, inf = 1e9;
int dist[4][mxn];

bool comp(int i, int j){
    return dist[0][i] < dist[0][j];
}


void findLocation(int N, int first, int location[], int stype[]){
    location[0] = first;
    stype[0] = 1;
    if(N==1) return;

    int piv1 = 1;
    for(int i = 1; i < N; i++){
        dist[0][i] = getDistance(0,i);
        if(dist[0][i] < dist[0][piv1])
            piv1 = i;
    }

    location[piv1] = location[0] + dist[0][piv1];
    stype[piv1] = 2;

    for(int i = 1; i < N; i++) if(i!=piv1)
        dist[1][i] = getDistance(piv1,i);

    vector<int> comp1,comp2;
    for(int i = 1; i < N; i++) if(i!=piv1){
        if(dist[1][i]+dist[0][piv1]==dist[0][i]) 
            comp1.push_back(i);
        else
            comp2.push_back(i);
    }

    sort(comp1.begin(),comp1.end(),comp);
    sort(comp2.begin(),comp2.end(),comp);
        
    if(!comp1.empty()){
        int piv = comp1[0];
        location[piv] = location[piv1] - dist[1][piv];
        stype[piv] = 1;

        set<pii> st; st.insert({location[piv],piv});
        st.insert({location[0],0});

        for(int i = 1; i < comp1.size(); i++){
            int v = comp1[i];
            int a = location[piv1] - dist[1][v];
            
            
            auto it = st.lower_bound(make_pair(a+1,-1));

            int cap = st.begin()->second;
            int req = getDistance(cap,v);
            int smt = 0;

            while(next(it) != st.end()){
                int u = it->second;

                if(2*(it->first) - next(it)->first >= a){
                    it++; continue;
                }

                if(req - (location[u]-location[cap]) + dist[1][u] == dist[1][v]){
                    location[v] = -a + 2*location[u];
                    stype[v] = 2; smt = 1;
                    break;
                }
                it++;
            }

            if(smt==0){
                location[v] = a;
                stype[v] = 1;
                st.insert({a,v});
            }
        }
    }

    if(!comp2.empty()){
        int piv = comp2[0];
        location[piv] = location[0] + dist[0][piv];
        stype[piv] = 2;

        set<pii> st; st.insert({location[piv],piv});
        st.insert({location[piv1],piv1});


        for(int i = 1; i < comp2.size(); i++){
            int v = comp2[i];
            int a = location[0] + dist[0][v];
            
            auto it = st.lower_bound(make_pair(a,-1));

            int cap = prev(st.end())->second;
            int req = getDistance(v,cap);
            
            int smt = 0;
            while(prev(it) != st.begin()){
                it--;
                if(2*(it->first) - prev(it)->first <= a) continue;

                int u = it->second;
                if(req - (location[cap]-location[u]) + dist[0][u] == dist[0][v]){
                    location[v] = -a + 2*location[u];
                    stype[v] = 1; smt = 1; break;
                }
            }

            if(smt==0){
                location[v] = a;
                stype[v] = 2;
                st.insert({a,v});
            }
        }
    }

    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...