結果
| 問題 |
No.406 鴨等間隔の法則
|
| コンテスト | |
| ユーザー |
はむ吉🐹
|
| 提出日時 | 2016-07-03 21:11:17 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 47 ms / 2,000 ms |
| コード長 | 1,660 bytes |
| コンパイル時間 | 752 ms |
| コンパイル使用メモリ | 81,596 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-07 11:15:17 |
| 合計ジャッジ時間 | 3,465 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
#include <algorithm> // std::stable_sortを用いる
#include <cassert>
#include <ciso646> // 論理演算子等の代替表記を用いる
#include <cstdlib> // EXIT_SUCCESSを用いる
#include <iostream>
#include <unordered_set>
#include <vector>
constexpr int MIN_N = 3;
constexpr int MAX_N = 100000;
constexpr int MIN_X = 0;
constexpr int MAX_X = 100000000;
int main() {
/* 以下のassertは入力が制約を満たしていることを確認するためのもの
解答の際にはなくてもよい */
// 鴨の数Nを受け取る
int n;
std::cin >> n;
assert(MIN_N <= n and n <= MAX_N);
// 座標の列を受け取る
std::vector<int> xs;
for (decltype(n) i = 0; i < n; i++)
{
int x;
std::cin >> x;
xs.push_back(x);
}
// 座標たちを昇順でソートする
std::stable_sort(xs.begin(), xs.end());
// 漸化式 d_j = x_{j + 1} - x_j に基づき
// 階差数列 {d_j} (j = 0, 1, ..., N - 2) をつくる
// 階差数列の項の順番は関係なく、
// この数列の要素からなる集合の要素と大きさがわかればよいので、
// いきなり集合に入れる
std::unordered_set<int> ds;
for (decltype(n) j = 0; j < n - 1; j++)
{
ds.insert(xs[j + 1] - xs[j]);
}
// 条件2および条件1について判定
// 集合の要素数が1であり、かつその要素が0ではないことを確かめる
if (ds.size() == 1 and ds.find(0) == ds.end())
{
std::cout << "YES" << std::endl;
}
else
{
std::cout << "NO" << std::endl;
}
return EXIT_SUCCESS;
}
はむ吉🐹