結果
問題 | No.199 星を描こう |
ユーザー | fumuumuf |
提出日時 | 2021-01-23 10:59:24 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 5,592 bytes |
コンパイル時間 | 1,864 ms |
コンパイル使用メモリ | 176,332 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-09 15:28:05 |
合計ジャッジ時間 | 2,811 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 1 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 2 ms
5,376 KB |
testcase_19 | AC | 2 ms
5,376 KB |
testcase_20 | AC | 2 ms
5,376 KB |
testcase_21 | AC | 2 ms
5,376 KB |
testcase_22 | AC | 2 ms
5,376 KB |
testcase_23 | AC | 2 ms
5,376 KB |
testcase_24 | AC | 2 ms
5,376 KB |
testcase_25 | AC | 2 ms
5,376 KB |
testcase_26 | AC | 2 ms
5,376 KB |
testcase_27 | AC | 2 ms
5,376 KB |
コンパイルメッセージ
main.cpp: In function 'int main()': main.cpp:209:22: warning: narrowing conversion of 'x' from 'int' to 'double' [-Wnarrowing] 209 | p.push_back({x, y}); | ^ main.cpp:209:25: warning: narrowing conversion of 'y' from 'int' to 'double' [-Wnarrowing] 209 | p.push_back({x, y}); | ^
ソースコード
#pragma region Region_1 #include <bits/stdc++.h> using namespace std; #define rep(i, n) for (int i = 0; i < (n); ++i) #define drep(i, n) for (int i = (n)-1; i >= 0; --i) #define srep(i, s, t) for (int i = s; i < t; ++i) #define rng(a) a.begin(), a.end() #define rrng(a) a.rbegin(), a.rend() using ll = long long; using P = pair<int, int>; using VI = vector<int>; using VVI = vector<VI>; using VL = vector<ll>; using VVL = vector<VL>; using VP = vector<P>; using VS = vector<string>; using VC = vector<char>; #define MOD 1000000007 const int INF = 1e9 + 10; const long long INFL = 2e18 + 10; // ll max > 9*10^18 template <class T, class C> bool chmax(T& a, C b) { if (a <= b) { a = b; return true; } return false; } template <class T, class C> bool chmin(T& a, C b) { if (a >= b) { a = b; return true; } return false; } template <class T> T sum(const vector<T>& v) { T res = 0; for (size_t i = 0; i < v.size(); ++i) res += v[i]; return res; } ///////////////////////////////////////////////////////// // print like python // https://qiita.com/Lily0727K/items/06cb1d6da8a436369eed ///////////////////////////////////////////////////////// void print() { cout << endl; } template <class Head, class... Tail> void print(Head&& head, Tail&&... tail) { cout << head; if (sizeof...(tail) != 0) cout << " "; print(forward<Tail>(tail)...); } template <class T> void print(vector<T>& vec) { for (auto& a : vec) { cout << a; if (&a != &vec.back()) cout << " "; } cout << endl; } template <class T> void print(vector<vector<T>>& df) { for (auto& vec : df) { print(vec); } } #pragma endregion Region_1 ///////////////////////////////////////////////////////// #define EPS (1e-10) #define equals(a, b) (fabs((a) - (b)) < EPS) struct Point { double x, y; Point(double x = 0, double y = 0) : x(x), y(y) {} Point operator+(Point p) { return Point(x + p.x, y + p.y); } Point operator-(Point p) { return Point(x - p.x, y - p.y); } Point operator*(double a) { return Point(a * x, a * y); } Point operator/(double a) { return Point(x / a, y / a); } double norm() { return x * x + y * y; } // ノルム double abs() { return sqrt(norm()); } // 大きさ bool operator<(const Point& p) const { return x != p.x ? x < p.x : y < p.y; } bool operator==(const Point& p) const { return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS; } }; // 線分 struct Segment { Point p1, p2; }; struct Circle { Point c; double r; Circle(Point c = Point(), double r = 0.0) : c(c), r(r) {} }; typedef Point Vector; // ベクトル typedef Segment Line; // 直線 typedef vector<Point> Polygon; // 多角形 // 内積 double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; } // 外積 double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; } /* * a1->a2 と b1->b2 のベクトルの外積 */ double cross(Point a1, Point a2, Point b1, Point b2) { return cross(a2 - a1, b2 - b1); } // 直行判定(内積=0) // 内積 = 0 で判定する bool isOrthogonal(Vector a, Vector b) { return equals(dot(a, b), 0.0); } bool isOrthogonal(Point a1, Point a2, Point b1, Point b2) { return isOrthogonal(a1 - a2, b1 - b2); } bool isOrthogonal(Segment s1, Segment s2) { return equals(dot(s1.p2 - s1.p1, s2.p2 - s2.p1), 0.0); } // 並行判定 // 外積の大きさ(|a||b|sin(t)) = 0 で判定する bool isParallel(Vector a, Vector b) { return equals(cross(a, b), 0.0); } bool isParallel(Point a1, Point a2, Point b1, Point b2) { return isParallel(a1 - a2, b1 - b2); } bool isParallel(Segment s1, Segment s2) { return equals(cross(s1.p2 - s1.p1, s2.p2 - s2.p1), 0.0); } // 交差判定 bool is_intersected_ls(Point a1, Point a2, Point b1, Point b2) { return (cross(a2 - a1, b1 - a1) * cross(a2 - a1, b2 - a1) < EPS) && // s1 と, s2 の両端との外積2つの積とる (cross(b2 - b1, a1 - b1) * cross(b2 - b1, a2 - b1) < EPS); } // 交差判定 bool is_intersected_ls(Segment s1, Segment s2) { return is_intersected_ls(s1.p1, s1.p2, s2.p1, s2.p2); } // 凸包 Polygon andrewScan(Polygon s) { Polygon sita; if (s.size() < 3) return s; // x 座標順に整列 sort(s.begin(), s.end()); sita.push_back(s[0]); sita.push_back(s[1]); // 下部 for (int i = 2; i < s.size(); i++) { for (int j = sita.size(); j >= 2; j--) { // 外積 < 0 であれば下に凸 if (cross(sita[j - 2], sita[j - 1], sita[j - 1], s[i]) > EPS) { break; } sita.pop_back(); } sita.push_back(s[i]); } // 上部 Polygon ue; ue.push_back(s[s.size() - 1]); ue.push_back(s[s.size() - 2]); for (int i = s.size() - 3; i >= 0; i--) { for (int j = ue.size(); j >= 2; j--) { if (cross(ue[j - 2], ue[j - 1], ue[j - 1], s[i]) > EPS) { break; } ue.pop_back(); } ue.push_back(s[i]); } // merge for (int i = 1; i < ue.size() - 1; i++) { sita.push_back(ue[i]); } return sita; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); std::cout << std::setprecision(28); Polygon p; rep(i, 5) { int x, y; cin >> x >> y; p.push_back({x, y}); } Polygon res= andrewScan(p); if(res.size() ==5){ print("YES"); }else{ print("NO"); } return 0; }