Galaxy distances
Given below c++ code is for wpc5e spoj or galaxy distances spoj.
Hint :-
1-> Construct a convex hull from given set of point.(N log N)
2-> Now the points having maximum distance will lie on boundary of convex hull.
/*
===================================================
Name :- Nishant Raj
Email :- raj.nishant360@gmail.com
College :- Indian School of Mines
Branch :- Computer Science and Engineering
Time :- 17 October 2015 (Saturday) 18:16
===================================================*/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define pll pair < long long , long long >
#define ll long long
#define gc getchar_unlocked
void scanint(int &x)
{
register int c = gc();
x = 0;
int neg = 0;
for(;((c<48 || c>57) && c != '-');c = gc());
if(c=='-') {neg=1;c=gc();}
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
if(neg) x=-x;
}
void pr_uint(unsigned long long n) {
if (n / 10 != 0)
pr_uint(n / 10);
putchar_unlocked((n % 10) + '0');
}
void pr_int(long long n) {
if (n < 0) {
putchar_unlocked('-');
n = -n;
}
pr_uint((unsigned long long) n);
}
long long orientation(pll P,pll Q,pll R){
return (Q.first-P.first)*(R.second-P.second)-(R.first-P.first)*(Q.second-P.second);
}
int slope_compare(pll &a , pll &b , pll &c , pll &d){
if((b.second - a.second)*(d.first - c.first) > (b.first - a.first)*(d.second - c.second))
return 1;
return 0;
}
void convex_hull(vector<pll > &P,vector<pll > &l,vector<pll > &u){
int j=0,k=0,n=P.size();
sort(P.begin(),P.end());
u.resize(2*n);
l.resize(2*n);
for(int i=0;i<n;i++)
{
while(j>=2 && orientation(l[j-2],l[j-1],P[i])<=0)
j--;
while(k>=2 && orientation(u[k-2],u[k-1],P[i])>=0)
k--;
l[j++]=P[i];
u[k++]=P[i];
}
u.resize(k);
l.resize(j);
}
long long Dist(pll P ,pll Q){
return abs(P.first*P.first - Q.first*Q.first)+abs(P.second*P.second - Q.second*Q.second);
}
int main()
{
int t;
scanint(t);
while(t--)
{
vector<pll >v,u,l;
int n;
scanint(n);
int k1;
for(int i=0;i<n;i++){
scanint(k1);
v.push_back(make_pair(i+1,k1));
}
if(n==1){
printf("0\n");
continue;
}
convex_hull(v,l,u);//conpute convex hull for set of points .
int i = 0 , j = l.size() -1;
ll ans = 0;
l.insert(l.end() , u.begin() , u.end());
for(int i = 0 ; i < l.size() ; i++){ // Brute Force to find points having maximum distance.
for(int j = 0 ; j < l.size() ; j++){
ans = max(ans , Dist(l[i] , l[j]));
}
}
pr_int(ans);
putchar_unlocked('\n');
}
}
No comments:
Post a Comment
Your comment is valuable to us