제출 #115056

#제출 시각아이디문제언어결과실행 시간메모리
115056ansol4328경주 (Race) (IOI11_race)C++11
100 / 100
1053 ms43728 KiB
#include "race.h"
#include<vector>
#include<queue>
#include<algorithm>
 
using namespace std;
typedef pair<int,int> P;
typedef vector<vector<P>> graph;
 
struct CentroidDecomposition
{
    graph CentTree;
    vector<bool> visit;
    vector<int> sub; // size of subtree
    int tot;
    CentroidDecomposition(int N)
    {
        CentTree.resize(N+5);
        visit.resize(N+5);
        sub.resize(N+5);
    }
    void get_sz(int cur, int prev, graph &tree)
    {
        sub[cur]=1;
        for(int i=0 ; i<tree[cur].size() ; i++)
        {
            int nxt=tree[cur][i].first;
            if(!visit[nxt] && nxt!=prev)
            {
                get_sz(nxt,cur,tree);
                sub[cur]+=sub[nxt];
            }
        }
    }
    int get_cen(int cur, int prev, graph &tree)
    {
        for(int i=0 ; i<tree[cur].size() ; i++)
        {
            int nxt=tree[cur][i].first;
            if(!visit[nxt] && nxt!=prev && sub[nxt]>tot/2)
                return get_cen(nxt,cur,tree);
        }
        return cur;
    }
    int decomp(int cur, int prev, graph &tree)
    {
        get_sz(cur,prev,tree);
        tot=sub[cur];
        int cen=get_cen(cur,prev,tree);
        visit[cen]=true;
        for(int i=0 ; i<tree[cen].size() ; i++)
        {
            int nxt=tree[cen][i].first;
            int nxtcen;
            if(!visit[nxt] && nxt!=prev)
            {
                nxtcen=decomp(nxt,cen,tree);
                CentTree[cen].push_back(P(nxtcen,0));
                CentTree[nxtcen].push_back(P(cen,0));
            }
        }
        return cen;
    }
};
 
int n, k, res=1e9;
graph lst;
bool check[200005];
int dist[1000005], idx;
P que[200005];
 
void clr_dist(int v, int prev, int dst)
{
    dist[dst]=1e9;
    dist[k-dst]=1e9;
    for(int i=0 ; i<lst[v].size() ; i++)
    {
        int nxt=lst[v][i].first;
        int d=lst[v][i].second;
        if(nxt!=prev && !check[nxt] && dst+d<=k) clr_dist(nxt,v,dst+d);
    }
}
 
void get_dist(int v, int prev, int dst, int cnt)
{
    que[++idx]=P(dst,cnt);
    res=min(res,dist[k-dst]+cnt);
    for(int i=0 ; i<lst[v].size() ; i++)
    {
        int nxt=lst[v][i].first;
        int d=lst[v][i].second;
        if(nxt!=prev && !check[nxt] && dst+d<=k)
        {
            get_dist(nxt,v,dst+d,cnt+1);
        }
    }
}
 
int best_path(int N, int K, int H[][2], int L[])
{
    n=N, k=K;
    lst.resize(n+5);
    for(int i=0 ; i<n-1 ; i++)
    {
        int x=H[i][0], y=H[i][1], d=L[i];
        x++, y++;
        lst[x].push_back(P(y,d));
        lst[y].push_back(P(x,d));
    }
    CentroidDecomposition T(n);
 
    int root=T.decomp(1,-1,lst);
    graph &ctree=T.CentTree;
    queue<int> Q;
    Q.push(root);
    check[root]=true;
    while(!Q.empty())
    {
        int v=Q.front();
        Q.pop();
        clr_dist(v,-1,0);
        dist[0]=0;
        for(int i=0 ; i<lst[v].size() ; i++)
        {
            idx=0;
            int nxt=lst[v][i].first;
            int d=lst[v][i].second;
            if(!check[nxt] && d<=k) get_dist(nxt,v,d,1);
            for(int j=1 ; j<=idx ; j++) dist[que[j].first]=min(dist[que[j].first],que[j].second);
        }
        for(int i=0 ; i<ctree[v].size() ; i++)
        {
            int nxt=ctree[v][i].first;
            if(!check[nxt])
            {
                Q.push(nxt);
                check[nxt]=true;
            }
        }
    }
    if(res==1e9) res=-1;
    return res;
}

컴파일 시 표준 에러 (stderr) 메시지

race.cpp: In member function 'void CentroidDecomposition::get_sz(int, int, graph&)':
race.cpp:25:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0 ; i<tree[cur].size() ; i++)
                       ~^~~~~~~~~~~~~~~~~
race.cpp: In member function 'int CentroidDecomposition::get_cen(int, int, graph&)':
race.cpp:37:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0 ; i<tree[cur].size() ; i++)
                       ~^~~~~~~~~~~~~~~~~
race.cpp: In member function 'int CentroidDecomposition::decomp(int, int, graph&)':
race.cpp:51:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0 ; i<tree[cen].size() ; i++)
                       ~^~~~~~~~~~~~~~~~~
race.cpp: In function 'void clr_dist(int, int, int)':
race.cpp:76:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0 ; i<lst[v].size() ; i++)
                   ~^~~~~~~~~~~~~~
race.cpp: In function 'void get_dist(int, int, int, int)':
race.cpp:88:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0 ; i<lst[v].size() ; i++)
                   ~^~~~~~~~~~~~~~
race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:123:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0 ; i<lst[v].size() ; i++)
                       ~^~~~~~~~~~~~~~
race.cpp:131:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0 ; i<ctree[v].size() ; i++)
                       ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...