Run Time: 0.060
Ranking (as of 2016-05-29): 4 out of 508
Language: C++
/*
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10927_Bright_Lights.cpp
*/
#include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N_max = 100000;
struct pole {
int X_, Y_, Z_, x_, y_, gcd_;
bool operator<(const pole& p) const {
if (x_ != p.x_)
return x_ < p.x_;
if (y_ != p.y_)
return y_ < p.y_;
if (gcd_ != p.gcd_)
return gcd_ < p.gcd_;
return Z_ < p.Z_;
}
} poles[N_max];
int invisibles[N_max];
bool compare_invisible(int i, int j)
{
return (poles[i].X_ != poles[j].X_) ?
poles[i].X_ < poles[j].X_ : poles[i].Y_ < poles[j].Y_;
}
int gcd(int x, int y)
{
if (x < y)
return gcd(y, x);
else
return y == 0 ? x : gcd(y, x % y);
}
int main()
{
for (int ds = 1; ; ds++) {
int n;
scanf("%d", &n);
if (!n)
break;
for (int i = 0; i < n; i++) {
pole& p = poles[i];
scanf("%d %d %d", &p.X_, &p.Y_, &p.Z_);
p.gcd_ = gcd(abs(p.X_), abs(p.Y_));
p.x_ = p.X_ / p.gcd_, p.y_ = p.Y_ / p.gcd_;
}
printf("Data set %d:\n", ds);
sort(poles, poles + n);
#ifdef DEBUG
for (int i = 0; i < n; i++)
printf("%d %d %d %d\n", poles[i].x_, poles[i].y_, poles[i].gcd_, poles[i].Z_);
#endif
int nr_invisibles = 0, x = poles[0].x_, y = poles[0].y_, Z = poles[0].Z_;
for (int i = 1; i < n; i++) {
if (poles[i].x_ != x || poles[i].y_ != y) {
x = poles[i].x_, y = poles[i].y_, Z = poles[i].Z_;
}
else {
if (poles[i].Z_ <= Z)
invisibles[nr_invisibles++] = i;
else
Z = poles[i].Z_;
}
}
if (nr_invisibles) {
sort(invisibles, invisibles + nr_invisibles, compare_invisible);
puts("Some lights are not visible:");
for (int i = 0; i < nr_invisibles; i++)
printf("x = %d, y = %d%c\n", poles[invisibles[i]].X_, poles[invisibles[i]].Y_,
((i < nr_invisibles - 1) ? ';' : '.'));
}
else
puts("All the lights are visible.");
}
return 0;
}
No comments:
Post a Comment