結果
問題 | No.8083 12歳 |
ユーザー |
![]() |
提出日時 | 2021-03-30 07:52:00 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 1,000 ms |
コード長 | 3,800 bytes |
コンパイル時間 | 1,315 ms |
コンパイル使用メモリ | 103,420 KB |
最終ジャッジ日時 | 2025-01-20 00:45:24 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 366 |
ソースコード
#include <iostream> #include <string> #include <vector> #include <functional> // std::function #include <algorithm> // std::count // 作りかけの validation 用ライブラリ namespace validate { using LL = long long int; using CC = std::function<bool(char)>; using S = std::string; namespace char_class { bool upper(char c) { return ('A' <= c && c <= 'Z'); } bool lower(char c) { return ('a' <= c && c <= 'z'); } bool digit(char c) { return ('0' <= c && c <= '9'); } bool alpha(char c) { return (upper(c) || lower(c)); } bool alnum(char c) { return (alpha(c) || digit(c)); } bool digit_or_minus(char c) { return (digit(c) || c == '-'); } CC of(S const & s) { return [&](char c) { return (std::count(s.begin(), s.end(), c) > 0); }; } } namespace internal { bool is_end = false; S input_while(CC ok) { S s; while(true) { char c = std::cin.get(); if(ok(c)) { s += c; } else { std::cin.unget(); break; } } return s; } bool is_positive_integer(S const & s) { if(s == "" || s[0] == '0') { return false; } for(char c: s) { if(! char_class::digit(c)) { return false; } } return true; } bool is_integer(S const & s) { if(s == "") { return false; } if(s == "0") { return true; } return is_positive_integer(s.substr(s[0] == '-' ? 1 : 0)); } } S tag_def = "[?]"; S tag_sep = " --> "; void check(bool p, S tag = tag_def) { if(! p) { std::cerr << "[!] Validation error: " << tag << std::endl; internal::is_end = true; exit(1); } } void input_equal(S s, S tag = tag_def) { tag += tag_sep + __func__; for(char c: s) { check(std::cin.get() == c, tag); } } LL get_int(LL mi, LL ma, S term, S tag = tag_def) { tag += tag_sep + __func__; auto s = internal::input_while(char_class::digit_or_minus); check(internal::is_integer(s), tag + " (is_integer)"); LL n = stoll(s); check(mi <= n && n <= ma, tag + " (range)"); input_equal(term, tag + " (term)"); return n; } std::vector<LL> get_vector_int(int n, LL mi, LL ma, S sep, S term, S tag = tag_def) { tag += tag_sep + __func__; check(0 <= n, tag + " (n: non-negative)"); std::vector<LL> v; while(static_cast<int>(v.size()) < n) { auto tag_i = tag + " ([" + std::to_string(v.size()) + "])"; v.push_back(get_int(mi, ma, "", tag_i)); if(static_cast<int>(v.size()) < n) { input_equal(sep, tag_i + " (sep)"); } } input_equal(term, tag + " (term)"); return v; } S get_string(int n, CC ok, S term, S tag = tag_def) { tag += tag_sep + __func__ + " by length"; check(0 <= n, tag + " (n: non-negative)"); S s; while(static_cast<int>(s.size()) < n) { s += std::cin.get(); check(ok(s.back()), tag + " (char_class)"); } input_equal(term, tag + " (term)"); return s; } S get_string(CC ok, int mi, int ma, S term, S tag = tag_def) { tag += tag_sep + __func__ + " by char_class"; auto s = internal::input_while(ok); check(mi <= static_cast<int>(s.size()) && static_cast<int>(s.size()) <= ma, tag + " (length)"); input_equal(term, tag + " (term)"); return s; } void input_end(S tag = tag_def) { tag += tag_sep + __func__; input_equal({ EOF }, tag); internal::is_end = true; } namespace internal { struct End { ~ End() { check(is_end, "Missing validate::input_end()."); } } end_; } } // ---- int main() { auto Y = validate::get_int(2000, 3000 - 1, " "); auto N = validate::get_int(1, 365, " "); auto D = validate::get_int(1, 365, "\n"); validate::input_end(); auto c = [](int y) -> int { return 365 + (y % 4 != 0 || (y % 100 == 0 && y % 400 != 0) ? 0 : 1); }; if(D > 333) { D += c(Y - 12) - c(Y + 1); } int mi = N - std::min(N, D), ma = std::min(N, c(Y - 12) - D); validate::check(0 <= mi && mi <= ma && ma <= N); std::cout << mi << " " << ma << std::endl; } // validation