Submission #151462

# Submission time Handle Problem Language Result Execution time Memory
151462 2019-09-03T09:28:41 Z Bodo171 Towns (IOI15_towns) C++14
100 / 100
23 ms 1016 KB
#include "towns.h"
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int nmax=205;

int n;
int d[2][nmax];
int to[nmax],wh[nmax],sz[nmax];
vector<int> domin[nmax];
int eq(int x,int y)
{
    return (to[x]+to[y]!=getDistance(x,y));
}
bool checkHub(int x)
{
    vector<int> cand;
    for(int i=0;i<n;i++)
    {
        domin[i].clear();
        sz[i]=0;
    }
    for(int i=0;i<n;i++)
        if(wh[i]==x)
           cand.push_back(i);
    int act=0,bal=0;
    for(auto it: cand)
    {
        if(bal==0)
        {
            act=it;
            bal++;
        }
        else
        {
            if(eq(act,it)) bal++;
            else
            {
                domin[act].push_back(it);
                bal--;
            }
        }
        sz[act]++;
    }
    int ap=0;
    for(auto it:cand)
    {
        if(sz[it])
        {
            if(eq(act,it)) ap+=sz[it]-(int)domin[it].size();
            else
            {
                for(auto oth: domin[it])
                {
                    ap+=eq(act,oth);
                }
            }
        }
    }
    return (ap<=n/2);
}
int hubDistance(int N, int sub) {
    int d1=0,R=0,mx=0,d2=0;
    n=N;
    for(int i=0;i<2;i++)
        for(int j=0;j<n;j++)
         d[i][j]=0;
    for(int i=1; i<n; i++)
    {
        d[0][i]=getDistance(0,i);
        if(d[0][i]>d[0][d1])
            d1=i;
    }
    for(int i=0; i<n; i++)
       if(i!=d1)
    {
        d[1][i]=getDistance(d1,i);
        if(d[1][i]>mx)
            mx=d[1][i],d2=i;
    }
    int minDist=(1<<30);
    int lim=d[1][d2]-(d[0][d2]+d[1][d2]-d[0][d1])/2;
    for(int i=0; i<n; i++)
    {
        to[i]=(d[0][i]+d[1][i]-d[0][d1])/2;
        wh[i]=(d[1][i]-to[i]);
        if(max(wh[i],mx-wh[i])<minDist&&wh[i]<=lim)
            minDist=max(wh[i],mx-wh[i]);
    }
    vector<int> hubs;
    for(int i=0;i<n;i++)
        if(max(wh[i],mx-wh[i])==minDist&&wh[i]<=lim)
            hubs.push_back(wh[i]);
    sort(hubs.begin(),hubs.end());
    hubs.resize(unique(hubs.begin(),hubs.end())-hubs.begin());
    bool ok=0;
    for(auto cen :hubs)
    {
        int mici=0,mari=0;
        for(int i=0;i<n;i++)
        {
            if(wh[i]<cen) mici++;
            if(wh[i]>cen) mari++;
        }
        if(mici<=n/2&&mari<=n/2)
            ok=checkHub(cen);
    }
    R=minDist;
    if(!ok) R=-R;
	return R;
}

Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:65:28: warning: unused parameter 'sub' [-Wunused-parameter]
 int hubDistance(int N, int sub) {
                            ^~~
# Verdict Execution time Memory Grader output
1 Correct 19 ms 376 KB Output is correct
2 Correct 16 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 20 ms 376 KB Output is correct
5 Correct 20 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 376 KB Output is correct
2 Correct 16 ms 376 KB Output is correct
3 Correct 21 ms 376 KB Output is correct
4 Correct 21 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 376 KB Output is correct
2 Correct 23 ms 1016 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 21 ms 936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 376 KB Output is correct
2 Correct 21 ms 888 KB Output is correct
3 Correct 21 ms 888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 376 KB Output is correct
2 Correct 21 ms 888 KB Output is correct
3 Correct 21 ms 1016 KB Output is correct