Submission #798562

# Submission time Handle Problem Language Result Execution time Memory
798562 2023-07-30T20:36:33 Z mosiashvililuka Towns (IOI15_towns) C++14
100 / 100
20 ms 596 KB
#include <bits/stdc++.h>
#include "towns.h"
using namespace std;
int a,b,c,d,e,i,j,ii,jj,zx,xc,fx[129][129],ind1,ind2,R,XOM,msh[129],zm[129],A;
int dista(int q, int w){
    if(fx[q][w]!=0) return fx[q][w];
    if(q==w) return 0;
    fx[q][w]=fx[w][q]=getDistance(q-1,w-1);
    return fx[q][w];
}
map <int, vector <int> > m;
bool check(int q, int w){
    int qw=dista(ind1,q)+dista(ind1,w)-XOM*2;
    if(qw==dista(q,w)){//sxvadasxvebia
        return 0;
    }else{//tolebia, lca qvemot aqvt ert qvexeshi arian
        return 1;
    }
}
int fnd(int q){
    if(msh[q]==q) return q; else return msh[q]=fnd(msh[q]);
}
void mrg(int q, int w){
    q=fnd(q);w=fnd(w);
    if(q==w) return;
    msh[w]=q;
    zm[q]+=zm[w];
}
int hubDistance(int NN, int Ssub) {
    a=NN;m.clear();
    for(i=0; i<=a+2; i++){
        for(j=0; j<=a+2; j++){
            fx[i][j]=0;
        }
        msh[i]=0;zm[i]=0;
    }
    ind1=2;
    for(i=2; i<=a; i++){
        if(dista(1,ind1)<dista(1,i)){
            ind1=i;
        }
    }
    ind2=1;
    for(i=1; i<=a; i++){
        if(i==ind1) continue;
        if(dista(ind1,ind2)<dista(ind1,i)) ind2=i;
    }

    R=999999999;
    A=dista(ind1,1)+dista(ind1,ind2)-dista(1,ind2);A/=2;
    for(i=1; i<=a; i++){
        zx=dista(ind1,i)+dista(1,i)-dista(ind1,1);zx/=2;
        zx=dista(ind1,i)-zx;
        if(zx>A) zx=A;
        R=min(R,max(zx,dista(ind1,ind2)-zx));
        m[zx].push_back(i);
    }


    int prv=0;
    for(auto taa:m){
        vector <int> v=taa.second;
        int SZ=v.size();
        if(max(taa.first,dista(ind1,ind2)-taa.first)==R){
            XOM=taa.first;
            if(prv<=a/2&&SZ<=a/2&&a-SZ-prv<=a/2) return R;

            if(prv<=a/2&&a-SZ-prv<=a/2){
                vector <int> S,ise;
                int alive=0;
                S=v;
                for(i=1; i<=a; i++){
                    msh[i]=i;zm[i]=1;
                }
                while(S.size()){
                    vector <int> nxt;
                    for(ii=1; ii<S.size(); ii+=2){
                        if(check(S[ii-1],S[ii])==1){
                            mrg(S[ii-1],S[ii]);
                            nxt.push_back(S[ii-1]);
                        }
                    }
                    if(S.size()%2==1) alive=S.back();
                    S=nxt;
                }
                if(alive==0) return R;
                int mdeni=zm[fnd(alive)];
                map <int, int> bo;
                for(auto x:v){
                    if(fnd(x)==fnd(alive)) continue;
                    c=fnd(x);
                    if(bo[c]!=0) continue;
                    bo[c]=1;
                    if(check(c,alive)==1) mdeni+=zm[c];
                }
                if(mdeni<=a/2) return R;
            }
        }
        prv+=SZ;
    }
    return -R;
}

Compilation message

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:63:22: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   63 |         int SZ=v.size();
      |                ~~~~~~^~
towns.cpp:77:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |                     for(ii=1; ii<S.size(); ii+=2){
      |                               ~~^~~~~~~~~
towns.cpp:29:29: warning: unused parameter 'Ssub' [-Wunused-parameter]
   29 | int hubDistance(int NN, int Ssub) {
      |                         ~~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 10 ms 552 KB Output is correct
2 Correct 9 ms 460 KB Output is correct
3 Correct 0 ms 308 KB Output is correct
4 Correct 12 ms 492 KB Output is correct
5 Correct 12 ms 432 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 476 KB Output is correct
2 Correct 9 ms 440 KB Output is correct
3 Correct 12 ms 456 KB Output is correct
4 Correct 12 ms 508 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 468 KB Output is correct
2 Correct 12 ms 556 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 12 ms 540 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 556 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 452 KB Output is correct
2 Correct 20 ms 520 KB Output is correct
3 Correct 16 ms 596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 496 KB Output is correct
2 Correct 12 ms 444 KB Output is correct
3 Correct 12 ms 568 KB Output is correct