Submission #1147539

#TimeUsernameProblemLanguageResultExecution timeMemory
1147539alexddTowns (IOI15_towns)C++20
61 / 100
19 ms328 KiB
#include "towns.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
int lim;
map<pair<int,int>,int> mp;
int query(int x, int y)
{
    if(x==y)
        return 0;
    if(x>y)
        swap(x,y);
    if(!mp[{x,y}])
    {
        //if(lim==0)while(1);lim--;
        mp[{x,y}] = getDistance(x,y);
    }
    return mp[{x,y}];
}
vector<int> calc_dist(int src)
{
    vector<int> dist(n);
    for(int i=0;i<n;i++)
        dist[i] = query(src,i);
    return dist;
}
int hubDistance(int N, int sub)
{
    mp.clear();
    n = N;
    if(sub==1 || sub==3) lim = n*(n-1)/2;
    else if(sub==2 || sub==4 || sub==6) lim = 7*n/2;
    else if(sub==5) lim = 5*n;
    vector<int> dist0 = calc_dist(0);
    int cap1=0;
    for(int i=0;i<n;i++)
        if(dist0[i]>dist0[cap1])
            cap1=i;
    vector<int> dist1 = calc_dist(cap1);
    int cap2=0;
    for(int i=0;i<n;i++)
        if(dist1[i]>dist1[cap2])
            cap2=i;
    vector<int> dist2 = calc_dist(cap2);
    int mnm = dist1[cap2];
    vector<int> injos(n);
    for(int i=0;i<n;i++)
    {
        injos[i] = dist1[i] + dist2[i] - dist1[cap2];
        assert(injos[i]%2==0);
        injos[i]/=2;
        mnm = min(mnm, max(dist1[i], dist2[i]) - injos[i]);
    }
    bool gasit=0;
    if(sub>2)
    {
        for(int i=0;i<n;i++)
        {
            if(max(dist1[i], dist2[i]) - injos[i] == mnm)
            {
                int cntst=0,cntmij=0,cntdr=0;
                vector<int> vmij;
                for(int j=0;j<n;j++)
                {
                    if(dist1[j]-injos[j] < dist1[i]-injos[i])
                    {
                        cntst++;
                    }
                    else if(dist1[j]-injos[j] == dist1[i]-injos[i])
                    {
                        cntmij++;
                        vmij.push_back(j);
                    }
                    else
                    {
                        cntdr++;
                    }
                }
                if(max(cntst,cntdr) <= n/2)
                {
                    //mai trebuie sa verific daca toti copii nodului ales din diametru sunt <=n/2
                    if(cntmij <= n/2)
                    {
                        gasit=1;
                        break;
                    }
                    int care=-1, cnt=0;
                    for(int x:vmij)
                    {
                        if(cnt==0)
                        {
                            care = x;
                            cnt = 1;
                        }
                        else if(query(care,x) == injos[x] + injos[care])
                        {
                            cnt--;
                        }
                        else
                        {
                            cnt++;
                            if(cnt > n/2)
                            {
                                break;
                            }
                        }
                    }

                    if(cnt<=n/2)
                    {
                        cnt=(int)vmij.size();
                        for(int x:vmij)
                            if(x!=care && query(care,x) == injos[x] + injos[care])
                            {
                                cnt--;
                                if(cnt <= n/2)
                                    break;
                            }
                    }
                    if(cnt <= n/2)
                    {
                        gasit=1;
                        break;
                    }
                }
            }
        }
    }


    if(!gasit)
        mnm = -mnm;
    return mnm;
}
#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...