結果
| 問題 | No.3438 [Cherry 8th Tune D] 競プロは向いてない |
| コンテスト | |
| ユーザー |
SnowBeenDiding
|
| 提出日時 | 2026-01-29 08:24:45 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,093 bytes |
| 記録 | |
| コンパイル時間 | 9,809 ms |
| コンパイル使用メモリ | 431,604 KB |
| 実行使用メモリ | 21,424 KB |
| 最終ジャッジ日時 | 2026-01-29 08:26:36 |
| 合計ジャッジ時間 | 102,408 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 31 WA * 2 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <atcoder/all>
#define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
using namespace atcoder;
using namespace std;
typedef long long ll;
template <class T>
vector<pair<T, T>> convex_hull(vector<pair<T, T>> pts) {
// https://atcoder.jp/contests/typical90/submissions/71641592
if (pts.size() <= 1) return pts;
sort(pts.begin(), pts.end());
pts.erase(unique(pts.begin(), pts.end()), pts.end());
if (pts.size() <= 2) return pts;
auto cross = [](auto const &a, auto const &b, auto const &c) {
return (b.first - a.first) * (c.second - a.second) -
(b.second - a.second) * (c.first - a.first);
};
vector<pair<T, T>> hull;
hull.reserve(pts.size() * 2);
for (auto const &p : pts) {
while (hull.size() >= 2 &&
cross(hull[hull.size() - 2], hull[hull.size() - 1], p) <= 0) {
hull.pop_back();
}
hull.push_back(p);
}
size_t lower_size = hull.size();
for (auto it = pts.rbegin(); it != pts.rend(); ++it) {
while (hull.size() >= lower_size + 1 &&
cross(hull[hull.size() - 2], hull[hull.size() - 1], *it) <= 0) {
hull.pop_back();
}
hull.push_back(*it);
}
hull.pop_back();
return hull;
}
void solve() {
int n;
cin >> n;
vector<pair<ll, ll>> p(n);
rep(i, 0, n) {
ll x, y;
cin >> x >> y;
p[i] = {x, y};
}
map<pair<ll, ll>, int> ma;
auto v = convex_hull(p);
rep(i, 0, n) ma[p[i]] = i;
auto valid = [&](int id, pair<ll, ll> q) {
ll tar = p[id].first * q.first + p[id].second * q.second;
rep(i, 0, n) {
if (i == id) continue;
ll val = p[i].first * q.first + p[i].second * q.second;
if (val >= tar) return 0;
}
return 1;
};
if (v.size() == 2) {
rep(i, 0, n) {
if (ma.find(p[i]) != ma.end()) {
rep(j, 0, 4) {
int x = "0211"[j] - '1';
int y = "1120"[j] - '1';
if (valid(i, {x, y})) {
cout << x << ' ' << y << '\n';
break;
}
}
} else {
cout << "No\n";
}
}
return;
}
vector<int> ex(n), ansx(n), ansy(n);
int m = v.size();
rep(i, 0, m) {
int pi = (i - 1 + m) % m;
int ni = (i + 1 + m) % m;
ll dx = v[ni].first - v[pi].first;
ll dy = v[ni].second - v[pi].second;
int id = ma[v[i]];
ex[id] = 1;
ansx[id] = dy;
ansy[id] = -dx;
}
rep(i, 0, n) {
if (ex[i]) {
cout << ansx[i] << ' ' << ansy[i] << '\n';
} else {
cout << "No\n";
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(15);
int t;
cin >> t;
while (t--) solve();
}
SnowBeenDiding