Cod sursa(job #1710166)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 28 mai 2016 16:49:22
Problema Metrou4 Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.11 kb
#include <fstream>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <bitset>
#include <queue>
#include <map>
#include <set>
#include <cmath>
#include <iomanip>
using namespace std;

/*class citire
{
  public:
    citire(string file, int buffsz=32768):
            buffer_size_(buffsz)
            {
        file_=fopen(file.c_str(), "r");buffer_=new char[buffsz];pointer_=buffer_+buffer_size_;
    }

    citire& operator>>(int &object)
    {
        object = 0;
        while (next()<'0' or next()>'9')advance();
        while (next()>='0' and next()<='9') {object=object*10 + next()-'0';advance();}
        return *this;
    }

  private:
    char next()
    {
        if (pointer_==buffer_+buffer_size_) {pointer_ = buffer_;fread(buffer_, 1, buffer_size_, file_);}
        return *pointer_;
    }

    void advance() {++pointer_;}
    FILE *file_;int buffer_size_;
    char *buffer_, *pointer_;
};*/
ifstream f("metrou4.in");
ofstream g("metrou4.out");

int N, x, sol , y , GR[150005], t;
vector< pair< int , int > > p[1505];
struct pct{int x,y;}v[150005];

inline int grupa(int nod)
{
    if (GR[nod]==nod) return nod;
    GR[nod]=grupa(GR[nod]);
    return GR[nod];
}


inline int dst(pct p1,pct p2){ return abs(p1.x-p2.x)+abs(p1.y-p2.y);}

int main()
{
    f >> t;
    while (t--) {
        f>>N; sol = 0;
        for(int i=1; i<=N; ++i)
        {
            f>>x>>y; v[x].x=x;
            v[x].y=y; GR[i]=i;
        }

        for (int i = 0; i < 1505; ++i) {
            p[i].clear();
        }

        for(int i=1; i<=N; ++i)
            for(int j=i+1; j<=min(1500+i, N); ++j)
                if( dst(v[i],v[j])<=1500 )
                    p[dst(v[i],v[j])].push_back(make_pair(i,j));

        for(int i=1; i<=1000; ++i)
            for(int j=0; j<(int)p[i].size(); ++j)
            {
                x=p[i][j].first; y=p[i][j].second;
                if(grupa(x)!=grupa(y))
                    GR[GR[x]]=GR[y], sol+=i;
            }

        g<<sol<<'\n';
    }
    return 0;
}