Pagini recente » Cod sursa (job #908304) | Cod sursa (job #308476) | Cod sursa (job #896024) | Cod sursa (job #2091957) | Cod sursa (job #1710161)
#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_;
};
citire f("metrou4.in");
ofstream g("metrou4.out");
int N, x, sol , y , GR[150005], t;
vector< pair< int , int > > p[1005];
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 < 1005; ++i) {
p[i].clear();
}
for(int i=1; i<=N; ++i)
for(int j=i+1; j<=min(1000+i, N); ++j)
if( dst(v[i],v[j])<=1000 )
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;
}