답안 #1029689

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1029689 2024-07-21T08:12:35 Z sleepntsheep 도시들 (IOI15_towns) C++17
13 / 100
10 ms 436 KB
#include "towns.h"
#include<string.h>
#include<stdlib.h>

#include<vector>
int z;

int cache[120][120];
int l(int i, int j){return i<j?i:j;}
int h(int i, int j){return i>j?i:j;}
int ask(int i, int j) { if(cache[i][j]>=0)return cache[i][j];return cache[i][j]=cache[j][i]=(i-j ? getDistance(i, j): 0); }

int argmax(int x, int N) {
    int mx = 0, dist = -1;
    for (int y, i = 0; i < N; ++i)
        if (dist < (y = ask(x, i)))
            dist = y, mx = i, z = dist;
    return mx;
}

#include<map>
/* each branch store [arbitary node, branch length (to that node), count of leaves node in branch] */
std::map<int,std::vector<std::array<int,3>>>M;

int hubDistance(int N, int sub) {
    memset(cache,-1,sizeof cache);
    if (sub==1){
        int d1 = argmax(0, N);
        int d2 = argmax(d1, N);
        int dd = z;

        int R = 1e9;
        for (int i = 0; i < N; ++i) {
            int a=ask(d1,i),b=ask(d2,i);
            int branch = (a+b-dd)/2;
            R=l(R,h(a,b)-branch);
        }

        return R;
    }else if(sub==3){
        int d1 = argmax(0, N);
        int d2 = argmax(d1, N);
        int dd = z;
        for(int i=0;i<N;++i)for(int j=0;j<N;++j)ask(i,j);

        int R = 1e9;
        for (int i = 0; i < N; ++i) {
            int a=ask(d1,i),b=ask(d2,i);
            int branch = (a+b-dd)/2;

            if(h(a,b)-branch<R){
                M.clear(),R=h(a,b)-branch;
                M[a-branch].push_back(std::array<int,3>{i,branch, 1});
            }
            else if(h(a,b)-branch==R){
                int found=0;
                for(auto &x:M[a-branch])
                    if(ask(x[0],i)<branch+x[1]) /* same branch */
                    {++x[2];found=1;break;}
                if(!found)
                    M[a-branch].push_back(std::array<int,3>{i,branch, 1});
            }

            R=l(R,h(a,b)-branch);
        }

        for(auto &[_,branchinfo]:M){
            int ok=1;
            for(auto&x:branchinfo)if(x[2]>(N/2))ok=0;
            if(ok)return R;
        }

        return -R;
    }
}


Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:75:1: warning: control reaches end of non-void function [-Wreturn-type]
   75 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 348 KB Output is correct
2 Correct 7 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 9 ms 436 KB Output is correct
5 Correct 10 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -