Ближайшая пара SPOJ logN время неверный ответ

0

Я пытаюсь решить эту проблему. http://www.spoj.com/problems/CLOPPAIR/
Моя основная идея состоит в том, чтобы разделить координаты на части, где в той же части все точки будут иметь одинаковые x. Сортировка всех координат по х и у.
Когда я проверю, какие точки ближе всего к Ni, я сравню его с более высоким y, равным x и более низким y и тем же x. Я также попытаюсь выполнить поиск в предыдущей части координаты x и искать их с бинарным поиском, и я также буду искать следующую часть координаты x.
Но я всегда ошибаюсь. Может ли кто-нибудь сказать мне, что не так. Код ниже.

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <utility>
#include <map>
#include <vector>
using namespace std;
typedef pair<int,int>par;
typedef long long int ll;
par niz[55000];
map<ll,ll>mapa2;
map<par,ll>mapa;
map<ll,ll>mapa3;
vector<par>V[55000];
ll a,b,c,d,e,f;
double euk=1561561616;
ll toc=0,toc2=0;
ll pos1=1,pos2;
void binary(ll pos,ll end)
{
     if(pos<pos1-1)
     {

      ll tockay=V[pos][end].second;
      ll low=0;
      ll high=V[pos+1].size();
      ll midd=0;
      while(low<=high)
      {
         midd=(low+high)/2;
         if(V[pos+1][midd].second>tockay)high=midd-1;
         else low=midd+1;
      }
      if(euk>sqrt((V[pos][end].first-V[pos+1][midd].first)*(V[pos][end].first-V[pos+1][midd].first)+(V[pos][end].second-V[pos+1][midd].second)*(V[pos][end].second-V[pos+1][midd].second)))
      {
        euk=sqrt((V[pos][end].first-V[pos+1][midd].first)*(V[pos][end].first-V[pos+1][midd].first)+(V[pos][end].second-V[pos+1][midd].second)*(V[pos][end].second-V[pos+1][midd].second));
        toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
        toc2=mapa[make_pair(V[pos+1][midd].first,V[pos+1][midd].second)];
      }
      if(midd-1>=0)
      {
         if(euk>sqrt((V[pos][end].first-V[pos+1][midd-1].first)*(V[pos][end].first-V[pos+1][midd-1].first)+(V[pos][end].second-V[pos+1][midd-1].second)*(V[pos][end].second-V[pos+1][midd-1].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos+1][midd-1].first)*(V[pos][end].first-V[pos+1][midd-1].first)+(V[pos][end].second-V[pos+1][midd-1].second)*(V[pos][end].second-V[pos+1][midd-1].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos+1][midd-1].first,V[pos+1][midd-1].second)];
         } 
      }
      if(midd-2>=0)
      {
         if(euk>sqrt((V[pos][end].first-V[pos+1][midd-2].first)*(V[pos][end].first-V[pos+1][midd-2].first)+(V[pos][end].second-V[pos+1][midd-2].second)*(V[pos][end].second-V[pos+1][midd-2].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos+1][midd-2].first)*(V[pos][end].first-V[pos+1][midd-2].first)+(V[pos][end].second-V[pos+1][midd-2].second)*(V[pos][end].second-V[pos+1][midd-2].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos+1][midd-2].first,V[pos+1][midd-2].second)];
         } 
      }
      if(midd+1<V[pos+1].size())
      {
         if(euk>sqrt((V[pos][end].first-V[pos+1][midd+1].first)*(V[pos][end].first-V[pos+1][midd+1].first)+(V[pos][end].second-V[pos+1][midd+1].second)*(V[pos][end].second-V[pos+1][midd+1].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos+1][midd+1].first)*(V[pos][end].first-V[pos+1][midd+1].first)+(V[pos][end].second-V[pos+1][midd+1].second)*(V[pos][end].second-V[pos+1][midd+1].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos+1][midd+1].first,V[pos+1][midd+1].second)];
         } 
      } 
      if(midd+2<V[pos+1].size())
      {
         if(euk>sqrt((V[pos][end].first-V[pos+1][midd+2].first)*(V[pos][end].first-V[pos+1][midd+2].first)+(V[pos][end].second-V[pos+1][midd+2].second)*(V[pos][end].second-V[pos+1][midd+2].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos+1][midd+2].first)*(V[pos][end].first-V[pos+1][midd+2].first)+(V[pos][end].second-V[pos+1][midd+2].second)*(V[pos][end].second-V[pos+1][midd+2].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos+1][midd+2].first,V[pos+1][midd+2].second)];
         } 
      }                      
     }
     //prllf("hhkhj %d\n",pos);
     if(pos!=1)
     {

      ll tockay=V[pos][end].second;
      ll low=0;
      ll high=V[pos-1].size();
      ll midd=0;
      while(low<=high)
      {
         midd=(low+high)/2;
         if(V[pos-1][midd].second>tockay)high=midd-1;
         else low=midd+1;
      }
      if(euk>sqrt((V[pos][end].first-V[pos-1][midd].first)*(V[pos][end].first-V[pos-1][midd].first)+(V[pos][end].second-V[pos-1][midd].second)*(V[pos][end].second-V[pos-1][midd].second)))
      {
        euk=sqrt((V[pos][end].first-V[pos-1][midd].first)*(V[pos][end].first-V[pos-1][midd].first)+(V[pos][end].second-V[pos-1][midd].second)*(V[pos][end].second-V[pos-1][midd].second));
        toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
        toc2=mapa[make_pair(V[pos-1][midd].first,V[pos-1][midd].second)];
      }
      if(midd-1>=0)
      {
         if(euk>sqrt((V[pos][end].first-V[pos-1][midd-1].first)*(V[pos][end].first-V[pos-1][midd-1].first)+(V[pos][end].second-V[pos-1][midd-1].second)*(V[pos][end].second-V[pos-1][midd-1].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos-1][midd-1].first)*(V[pos][end].first-V[pos-1][midd-1].first)+(V[pos][end].second-V[pos-1][midd-1].second)*(V[pos][end].second-V[pos-1][midd-1].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos-1][midd-1].first,V[pos-1][midd-1].second)];
         } 
      }
      if(midd-2>=0)
      {
         if(euk>sqrt((V[pos][end].first-V[pos-1][midd-2].first)*(V[pos][end].first-V[pos-1][midd-2].first)+(V[pos][end].second-V[pos-1][midd-2].second)*(V[pos][end].second-V[pos-1][midd-2].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos-1][midd-2].first)*(V[pos][end].first-V[pos-1][midd-2].first)+(V[pos][end].second-V[pos-1][midd-2].second)*(V[pos][end].second-V[pos-1][midd-2].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos-1][midd-2].first,V[pos-1][midd-2].second)];
         } 
      }
      if(midd+1<V[pos-1].size())
      {
         if(euk>sqrt((V[pos][end].first-V[pos-1][midd+1].first)*(V[pos][end].first-V[pos-1][midd+1].first)+(V[pos][end].second-V[pos-1][midd+1].second)*(V[pos][end].second-V[pos-1][midd+1].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos-1][midd+1].first)*(V[pos][end].first-V[pos-1][midd+1].first)+(V[pos][end].second-V[pos-1][midd+1].second)*(V[pos][end].second-V[pos-1][midd+1].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos-1][midd+1].first,V[pos-1][midd+1].second)];
         } 
      }
      if(midd+2<V[pos+1].size())
      {
         if(euk>sqrt((V[pos][end].first-V[pos-1][midd+2].first)*(V[pos][end].first-V[pos-1][midd+2].first)+(V[pos][end].second-V[pos-1][midd+2].second)*(V[pos][end].second-V[pos-1][midd+2].second)))
         {
          euk=sqrt((V[pos][end].first-V[pos-1][midd+2].first)*(V[pos][end].first-V[pos-1][midd+2].first)+(V[pos][end].second-V[pos-1][midd+2].second)*(V[pos][end].second-V[pos-1][midd+2].second));
          toc=mapa[make_pair(V[pos][end].first,V[pos][end].second)];
          toc2=mapa[make_pair(V[pos-1][midd+2].first,V[pos-1][midd+2].second)];
         } 
      }
     }
}  
int main()
{
    scanf("%llu",&a);
    for(ll i=0;i<a;++i)
    {
            scanf("%llu%llu",&b,&c);
            niz[i]=make_pair(b,c);
            mapa[make_pair(b,c)]=i;
    }
    sort(niz,niz+a);

    for(ll i=0;i<a;++i)
    {
            if(mapa2[niz[i].first]==0)
            {
              V[pos1].push_back(make_pair(niz[i].first,niz[i].second));
              mapa2[niz[i].first]=pos1;
              mapa3[pos1]=niz[i].first;
              ++pos1;
            }
            else V[pos1].push_back(make_pair(niz[i].first,niz[i].second));
    }
    for(ll i=0;i<pos1;++i)
    {
            for(ll j=0;j<V[i].size();++j)
            {
                    if(j!=0)
                    {
                       if(euk>V[i][j].second-V[i][j-1].second)
                       {
                          euk=V[i][j].second-V[i][j-1].second;
                          toc=mapa[make_pair(mapa3[i],V[i][j].second)];
                          toc2=mapa[make_pair(V[i][j-1].first,V[i][j-1].second)];
                       }
                    }
                    if(j!=V[i].size()-1)
                    {
                       //prllf("%d\n",V[i][j+1].second-V[i][j].second);
                       if(euk>V[i][j+1].second-V[i][j].second)
                       {
                          euk=V[i][j+1].second-V[i][j].second;
                          toc=mapa[make_pair(mapa3[i],V[i][j].second)];
                          toc2=mapa[make_pair(V[i][j+1].first,V[i][j+1].second)];
                       }
                    }
                    binary(i,j);
            }
    }
    printf("%llu %llu %.6lf\n",min(toc,toc2),max(toc,toc2),euk+ + 1e-9);
}
Теги:
algorithm
sorting
closest

1 ответ

1

Я не могу сказать вам, что такое ваша ошибка, но я расскажу вам, как ее найти. Написание решения грубой силы для небольшого количества точек очень просто - просто вычислите расстояние между любыми двумя парами и найдите минимальное расстояние. Для небольшого n это решение достаточно хорошо. Теперь создайте случайные точки (например, до 20) с относительно небольшими координатами (скажем, до 100) и сравните ответы своего решения и грубой силы. Продолжайте делать это до тех пор, пока ответы вашего решения и грубой силы не будут отличаться. Когда я пробовал этот подход, я обнаружил случаи, когда я был не очень прав, и в первый момент я не смог найти неправильный тест за 20 секунд, оказалось, что я исправил свое решение.

Я решил очень похожую проблему около недели назад, и я смог исправить свое решение именно таким образом, который я описываю. Также я сделал это во время соревнований, и я считаю, что это правильный подход к проблемам, которые могут иметь много краевых случаев.

Кстати, классическое решение этой проблемы использует деление и покорение, и это тот подход, который я реализовал.

EDIT: на самом деле после небольшой мысли, я думаю, что могу привести пример, что ваше решение вы терпите неудачу. Ваша логика неверна - возможно, вам понадобится секунда, чтобы продолжить x (или даже дальше). Попробуйте этот набор точек: (1, 1), (2,100), (3,2)

  • 0
    Можете ли вы дать мне немного больше информации о поиске D & C для самой короткой пары.
  • 0
    Я реализовал свое решение, используя эту статью

Ещё вопросы

Сообщество Overcoder
Наверх
Меню