割り算するのが怖いからccw
typedef complex<double> Point;
double cross(Point a, Point b)
{
return (a.real() * b.imag() - a.imag() * b.real());
}
double dot(Point a, Point b)
{
return (a.real() * b.real() + a.imag() * b.imag());
}
namespace CCW{
enum{ RIGHT = 1, LEFT = -1, FRONT = 2, BACK = 2, OTHER = 0 };
};
int ccw(Point a, Point b, Point c)
{
b -= a;
c -= a;
if( cross(b, c) < 0 )return CCW::RIGHT;
if( cross(b, c) > 0 )return CCW::LEFT;
if( dot(b, c) < 0 )return CCW::BACK;
if( norm(b) < norm(c) )return CCW::FRONT;
return CCW::OTHER;
}
class BestView {
public:
int numberOfBuildings(vector <int> hs)
{
const int N = hs.size();
if (N == 1) return 0;
if (N == 2) return 1;
vector<Point> ps;
for (int i = 0; i < N; ++i) {
ps.push_back(Point(i, hs[i]));
}
int mx = 0;
for (int i = 0; i < N; ++i) {
int cnt = 0;
if (i) ++cnt;
for (int j = 0; j < i - 1; ++j) {
bool flg = true;
for (int k = j + 1; k < i; ++k) {
flg = flg && ccw(ps[j], ps[i], ps[k]) == CCW::RIGHT;
}
if (flg) ++cnt;
}
if (i + 1 < N) ++cnt;
for (int j = i + 2; j < N; ++j) {
bool flg = true;
for (int k = i + 1; k < j; ++k) {
flg = flg && ccw(ps[i], ps[j], ps[k]) == CCW::RIGHT;
}
if (flg) ++cnt;
}
mx = max(mx, cnt);
}
return mx;
}
};