제출 #714110

#제출 시각아이디문제언어결과실행 시간메모리
714110lam도시들 (IOI15_towns)C++14
0 / 100
1 ms484 KiB
#include "towns.h"
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
#define ff first
#define ss second
const int maxn = 510;
int n, root, m;
int d[maxn][maxn];
vector <ii> adj[maxn];
int s[maxn],id[maxn],nhanh,rt[maxn];
int dp[maxn];
ii par[maxn];
int num = 0;
bool cmp(ii x, ii y)
{
    return s[x.ff]>s[y.ff];
}
void dfs(int x, int p)
{
    s[x] = 1;
    for (ii i:adj[x])
    {
        dfs(i.ff,x);
        par[i.ff]  ={x,i.ss};
        s[x] += s[i.ff];
    }
    rt[x] = x;
    sort(adj[x].begin(),adj[x].end(),cmp);
    if (!adj[x].empty()) rt[x] = rt[adj[x][0].ff];
}
void build(bool nguoc = 0)
{
    for (int i=0; i<m; i++) adj[i].clear(), rt[i] = -1, s[i] = 0;
    for (int i=0; i<m; i++)
    {
        ii u = par[i];
        if (u.ff==i||u.ff==-1) continue;
        adj[u.ff].push_back({i,u.ss});
        if (nguoc) adj[i].push_back({u.ff,u.ss});
    }
    if (!nguoc) dfs(root,root);
}
int Ask(int u, int v)
{
    if (u>v) swap(u,v);
    if (d[u][v] == -1)
    {
        num++;
        assert(num<=5*n);
        d[u][v] = getDistance(u,v);
    }
    return d[u][v];
}
void addNode(int p, int w)
{
    par[m++] = {p,w};
}
iii get(int a, int b, int c)
{
    /**
        d = lca(b,c);
    **/
    int ad = (Ask(a,b) + Ask(a,c) - Ask(b,c) ) /2;
    int bd = Ask(a,b) - ad;
    int cd = Ask(a,c) - ad;
//    cerr<<a<<' '<<b<<' '<<c<<" ?? "<<ad<<' '<<bd<<' '<<cd<<endl;
    return {ad,{bd,cd}};
}

void dfs2(int x, int p)
{
    s[x] = (x<n);
    dp[x] = 0;
    for (ii i:adj[x])
        if (i.ff!=p)
    {
        dfs2(i.ff,x);
        s[x] += s[i.ff];
        dp[x] = max(dp[x],dp[i.ff]+i.ss);
    }
}

int hubDistance(int N, int sub) {
    vector <int> a;
    n=N; m=n;
    for (int i=0; i<n; i++) a.push_back(i);
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++) d[i][j] = -1;
//    random_shuffle(a.begin(),a.end());
    for (int i=0; i<n; i++) par[i] = {-1,-1};
    root = a[0];
    iii temp = get(a[0],a[1],a[2]);
    addNode(root,temp.ff);
    par[1] = {m-1,temp.ss.ff};
    par[2] = {m-1,temp.ss.ss};

//        for (int j=0; j<m; j++) cerr<<par[j].ff<<','<<par[j].ss<<' '; cerr<<endl;
    for (int i=3; i<n; i++)
    {
        build();

        int x = root;
        int dist_temp = 0;
        while (true)
        {
            bool check = 1;
            for (ii j:adj[x])
            {
                int v = j.ff;
                iii temp = get(root,rt[v],a[i]);
                if (temp.ff == dist_temp) continue;
                int u = rt[v];
                int dist = 0;
                while (u!=x&&dist + par[u].ss <= temp.ss.ff)
                {
                    dist+=par[u].ss;
                    u=par[u].ff;
                }
//                cerr<<x<<' '<<rt[v]<<' '<<a[i]<<" = "<<u<<' '<<par[u].ff<<','<<par[u].ss<<" : "<<temp.ss.ff<<' '<<dist<<endl;
                if (dist == temp.ss.ff)
                {
                    x=u; check = 0;
                    dist_temp = temp.ff;
                    par[a[i]] = {x,temp.ss.ss};
                    break;
                }
                else
                {
                    addNode(par[u].ff,dist + par[u].ss - temp.ss.ff);
                    par[u] = {m-1, temp.ss.ff - dist};
                    x=u;
                    par[a[i]] = {m-1,temp.ss.ss};
                    check=1;
                    break;
                }
            }
            if (check) break;
        }
//        for (int j=0; j<m; j++) cerr<<par[j].ff<<','<<par[j].ss<<' '; cerr<<endl;
    }
    build(1);
//    for (int i=0; i<m; i++)
//    {
//        cerr<<i<<" := ";
//        for (ii j:adj[i]) cerr<<j.ff<<','<<j.ss<<"  "; cerr<<endl;
//    }
    int R = 1e9;
    int it = -1;
    for (int i=n; i<m; i++)
    {
        dfs2(i,i);
        bool ccheck = 1;
        for (ii j:adj[i]) if (s[j.ff] > n/2) ccheck = 0;
//        cerr<<dp[i]<<" :: "<<ccheck<<endl;
        if (dp[i] < R)
        {
            R = dp[i];
            it = ccheck;
        }
        else if (dp[i] == R) it |=ccheck;
    }
    if (!it) R = -R;
    return R;
}

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

towns.cpp: In function 'void dfs(int, int)':
towns.cpp:20:21: warning: unused parameter 'p' [-Wunused-parameter]
   20 | void dfs(int x, int p)
      |                 ~~~~^
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:112:21: warning: declaration of 'temp' shadows a previous local [-Wshadow]
  112 |                 iii temp = get(root,rt[v],a[i]);
      |                     ^~~~
towns.cpp:94:9: note: shadowed declaration is here
   94 |     iii temp = get(a[0],a[1],a[2]);
      |         ^~~~
towns.cpp:85:28: warning: unused parameter 'sub' [-Wunused-parameter]
   85 | int hubDistance(int N, int sub) {
      |                        ~~~~^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...