Submission #670268

#TimeUsernameProblemLanguageResultExecution timeMemory
670268victor_gaoTowns (IOI15_towns)C++17
Compilation error
0 ms0 KiB
#include "towns.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "graderlib.c"
#include <bits/stdc++.h>
#define MAXN 250
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
int dis[MAXN][MAXN],cnt=1,go_fa[MAXN],fa[MAXN],son[MAXN],mxson[MAXN];
vector<pii>g[MAXN];
struct dsu{
    int boss[MAXN+5];
    void init(int n){
        for (int i=1;i<=n;i++)
            boss[i]=i;
    }
    int find(int x){
        if (boss[x]==x) return x;
        return boss[x]=find(boss[x]);
    }
    void Merge(int a,int b){
        boss[find(a)]=boss[find(b)];
    }
}d;
vector<int> solve(vector<int>have){
    int n=have.size();
    vector<int>all[n+5];
    if (have.size()==1) return {};
    else if (have.size()==2){
        fa[have[0]]=have[1]; go_fa[have[0]]=dis[have[0]][have[1]];
        fa[have[1]]=have[0]; go_fa[have[1]]=dis[have[0]][have[1]];
        g[have[0]].push_back({have[1],dis[have[0]][have[1]]});
        g[have[1]].push_back({have[0],dis[have[1]][have[0]]});
        return {};
    }
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            for (int k=j+1;k<n;k++){
                if (i!=j&&k!=i&&j!=k){
                    int a=have[i],b=have[j],c=have[k];
                    all[i].push_back((dis[a][b]+dis[a][c]-dis[b][c])/2);
                }
            }
        }
        sort(all[i].begin(),all[i].end());
        go_fa[have[i]]=all[i][0];
    }
    for (int i=0;i<n;i++){
        for (int j=i+1;j<n;j++){
            int a=have[i],b=have[j];
            if (dis[a][b]==go_fa[a]+go_fa[b])
                d.Merge(a,b);
        }
    }
    vector<int>vt,ans;
    for (int i=0;i<n;i++)
        vt.push_back(d.find(have[i]));
    sort(vt.begin(),vt.end());
    vt.resize(unique(vt.begin(),vt.end())-vt.begin());
    for (auto i:vt)
        fa[i]=cnt++;
    for (int i=0;i<(int)vt.size();i++){
        g[vt[i]].push_back({fa[vt[i]],go_fa[vt[i]]});
        g[fa[vt[i]]].push_back({vt[i],go_fa[vt[i]]});
        for (int j=i+1;j<(int)vt.size();j++){
            int a=vt[i],b=vt[j];
            int nd=dis[a][b]-go_fa[a]-go_fa[b];
            dis[fa[a]][fa[b]]=nd;
            dis[fa[b]][fa[a]]=nd;
        }
    }
    for (auto i:have){
        fa[i]=fa[d.find(i)];
        g[i].push_back({fa[i],go_fa[i]});
        g[fa[i]].push_back({i,go_fa[i]});
    }
    for (auto i:vt)
        ans.push_back(fa[i]);
    return ans;
}
int dfs(int p,int lp){
    int d=0; mxson[p]=0; son[p]=0;
    for (auto i:g[p]){
        if (i.x!=lp){
            d=max(d,dfs(i.x,p)+i.y);
            mxson[p]=max(mxson[p],son[i.x]);
            son[p]+=son[i.x];
        }
    }
    return d;
}
int hubDistance(int N, int sub) {
    vector<int>all;
    cnt=N;
    d.init(MAXN);
    for (int i=0;i<N;i++){
        all.push_back(i);
        for (int j=i+1;j<N;j++){
            dis[i][j]=getDistance(i,j);
            dis[j][i]=dis[i][j];
        }
    }
    while (!all.empty())
        all=solve(all);
    /*
    for (int i=0;i<cnt;i++){
        cout<<i<<" -> ";
        for (auto j:g[i])
            cout<<"{"<<j.x<<','<<j.y<<"} ";
        cout<<'\n';
    }
    */
    int mn=1e9,have=-1,p;
    for (int i=N;i<cnt;i++){
        for (int i=0;i<N;i++)
            son[i]=1;
        int d=dfs(i,0);
        if (d<mn){
            mn=min(mn,d);
            p=i;
        }
    }
   // cout<<p<<" "<<mn<<'\n';
    if (max(mxson[p],N-son[p])<=N/2)
        have=1;
    return have*mn;
}

Compilation message (stderr)

towns.cpp: In function 'std::vector<int> solve(std::vector<int>)':
towns.cpp:29:20: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   29 |     int n=have.size();
      |           ~~~~~~~~~^~
towns.cpp: In function 'int dfs(int, int)':
towns.cpp:85:9: warning: declaration of 'd' shadows a global declaration [-Wshadow]
   85 |     int d=0; mxson[p]=0; son[p]=0;
      |         ^
towns.cpp:27:2: note: shadowed declaration is here
   27 | }d;
      |  ^
towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:118:18: warning: declaration of 'i' shadows a previous local [-Wshadow]
  118 |         for (int i=0;i<N;i++)
      |                  ^
towns.cpp:117:14: note: shadowed declaration is here
  117 |     for (int i=N;i<cnt;i++){
      |              ^
towns.cpp:120:13: warning: declaration of 'd' shadows a global declaration [-Wshadow]
  120 |         int d=dfs(i,0);
      |             ^
towns.cpp:27:2: note: shadowed declaration is here
   27 | }d;
      |  ^
towns.cpp:95:28: warning: unused parameter 'sub' [-Wunused-parameter]
   95 | int hubDistance(int N, int sub) {
      |                        ~~~~^~~
/usr/bin/ld: /tmp/ccX8Y5G2.o: in function `_ini_query(int, int)':
grader.c:(.text+0x0): multiple definition of `_ini_query(int, int)'; /tmp/ccVrAnoZ.o:towns.cpp:(.text+0x460): first defined here
/usr/bin/ld: /tmp/ccX8Y5G2.o: in function `getDistance(int, int)':
grader.c:(.text+0x110): multiple definition of `getDistance(int, int)'; /tmp/ccVrAnoZ.o:towns.cpp:(.text+0x570): first defined here
collect2: error: ld returned 1 exit status