結果
問題 |
No.3154 convex polygon judge
|
ユーザー |
![]() |
提出日時 | 2025-05-20 22:49:38 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 314 ms / 2,000 ms |
コード長 | 1,606 bytes |
コンパイル時間 | 6,445 ms |
コンパイル使用メモリ | 332,664 KB |
実行使用メモリ | 20,328 KB |
最終ジャッジ日時 | 2025-05-20 22:49:48 |
合計ジャッジ時間 | 7,962 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 44 |
ソースコード
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using mint = modint998244353; int N; ll X[2 << 17]; ll Y[2 << 17]; ll ccw(int i, int j, int k) { ll xi = X[i] - X[j]; ll yi = Y[i] - Y[j]; ll xk = X[k] - X[j]; ll yk = Y[k] - Y[j]; ll cross = xk * yi - yk * xi; return cross == 0 ? 0 : cross / abs(cross); } ll dist(int i, int j) { ll xi = X[i] - X[j]; ll yi = Y[i] - Y[j]; return xi * xi + yi * yi; } pair<ll, ll> tan(int i, int j) { ll dx = X[j] - X[i]; ll dy = Y[j] - Y[i]; ll g = gcd(dx, dy); ll sgn = dx >= 0 ? 1 : -1; return make_pair(dx / g * sgn, dy / g * sgn); } int find_pivot() { vector<int> P(N); iota(P.begin(), P.end(), 0); auto it = min_element(P.begin(), P.end(), [&](int i, int j) { return X[i] != X[j] ? X[i] < X[j] : Y[i] < Y[j]; }); return it - P.begin(); } int main() { cin >> N; for(int i = 0; i < N; i++) { cin >> X[i] >> Y[i]; } const int k = find_pivot(); map<pair<ll, ll>, int> cnt_tan; for(int i = 0; i < N; i++) { if(i == k) continue; cnt_tan[tan(k, i)]++; } for(auto [_, c] : cnt_tan) { if(c >= 2) { cout << "No" << endl; return 0; } } vector<int> P(N); iota(P.begin(), P.end(), 0); P.erase(P.begin() + k); sort(P.begin(), P.end(), [&](int i, int j) { return ccw(k, i, j) == 1; }); P.push_back(k); for(int x = 0; x < N; x++) { int y = (x + 1) % N; int z = (x + 2) % N; if(ccw(P[x], P[y], P[z]) != 1) { cout << "No" << endl; return 0; } } cout << "Yes" << endl; }