結果
問題 | No.1036 Make One With GCD 2 |
ユーザー | rsk0315 |
提出日時 | 2020-04-25 02:59:09 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 283 ms / 2,000 ms |
コード長 | 2,578 bytes |
コンパイル時間 | 672 ms |
コンパイル使用メモリ | 66,140 KB |
実行使用メモリ | 11,184 KB |
最終ジャッジ日時 | 2024-09-16 13:35:12 |
合計ジャッジ時間 | 8,527 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 133 ms
7,152 KB |
testcase_01 | AC | 120 ms
6,944 KB |
testcase_02 | AC | 110 ms
10,900 KB |
testcase_03 | AC | 18 ms
6,940 KB |
testcase_04 | AC | 29 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 40 ms
6,940 KB |
testcase_08 | AC | 34 ms
6,940 KB |
testcase_09 | AC | 174 ms
6,944 KB |
testcase_10 | AC | 161 ms
6,940 KB |
testcase_11 | AC | 177 ms
6,940 KB |
testcase_12 | AC | 163 ms
6,940 KB |
testcase_13 | AC | 278 ms
6,940 KB |
testcase_14 | AC | 283 ms
6,944 KB |
testcase_15 | AC | 259 ms
6,940 KB |
testcase_16 | AC | 267 ms
6,940 KB |
testcase_17 | AC | 275 ms
6,944 KB |
testcase_18 | AC | 2 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,944 KB |
testcase_20 | AC | 2 ms
6,940 KB |
testcase_21 | AC | 3 ms
6,944 KB |
testcase_22 | AC | 259 ms
6,940 KB |
testcase_23 | AC | 188 ms
6,944 KB |
testcase_24 | AC | 273 ms
6,944 KB |
testcase_25 | AC | 244 ms
6,940 KB |
testcase_26 | AC | 255 ms
6,940 KB |
testcase_27 | AC | 2 ms
6,940 KB |
testcase_28 | AC | 2 ms
6,944 KB |
testcase_29 | AC | 2 ms
6,940 KB |
testcase_30 | AC | 2 ms
6,940 KB |
testcase_31 | AC | 2 ms
6,940 KB |
testcase_32 | AC | 2 ms
6,944 KB |
testcase_33 | AC | 2 ms
6,944 KB |
testcase_34 | AC | 2 ms
6,940 KB |
testcase_35 | AC | 2 ms
6,944 KB |
testcase_36 | AC | 1 ms
6,944 KB |
testcase_37 | AC | 1 ms
6,944 KB |
testcase_38 | AC | 106 ms
11,184 KB |
testcase_39 | AC | 149 ms
6,944 KB |
testcase_40 | AC | 194 ms
6,944 KB |
testcase_41 | AC | 177 ms
6,944 KB |
testcase_42 | AC | 175 ms
6,944 KB |
testcase_43 | AC | 165 ms
7,696 KB |
testcase_44 | AC | 175 ms
7,316 KB |
ソースコード
#line 1 "test/yc_1036_test.cpp" #define PROBLEM "https://yukicoder.me/problems/no/1036" #include <cstdint> #include <cstdio> #include <algorithm> #include <numeric> #include <vector> #line 1 "DataStructure/foldable_queue.cpp" /** * @brief fold 可能キュー * @author えびちゃん */ #include <cstddef> #include <stack> #include <utility> template <class Monoid> class foldable_queue { public: using size_type = size_t; using value_type = Monoid; private: std::stack<value_type> M_front, M_back; value_type M_back_folded{}; void M_distribute_to_front() { if (!M_back.empty()) { M_front.push(std::move(M_back.top())); M_back.pop(); } while (!M_back.empty()) { M_back.top() += M_front.top(); M_front.push(std::move(M_back.top())); M_back.pop(); } M_back_folded = value_type{}; } public: size_type size() const { return M_front.size() + M_back.size(); } bool empty() const noexcept { return M_front.empty() && M_back.empty(); } void push(value_type const& x) { M_back.push(x); M_back_folded += M_back.top(); } template <typename... Args> void emplace(Args&&... args) { M_back.emplace(std::forward<Args>(args)...); M_back_folded += M_back.top(); } void pop() { if (M_front.empty()) M_distribute_to_front(); M_front.pop(); } value_type fold() const { if (M_front.empty()) return M_back_folded; return M_front.top() + M_back_folded; } }; #line 10 "test/yc_1036_test.cpp" template <typename Tp> class gcd_monoid { public: using value_type = Tp; private: value_type M_x = 0; public: gcd_monoid() = default; // identity gcd_monoid(value_type const& x): M_x(x) {} gcd_monoid& operator +=(gcd_monoid const& that) { M_x = std::gcd(M_x, that.M_x); return *this; } friend bool operator ==(gcd_monoid const& lhs, gcd_monoid const& rhs) { return lhs.M_x == rhs.M_x; } friend gcd_monoid operator +(gcd_monoid lhs, gcd_monoid const& rhs) {return lhs += rhs; } friend bool operator !=(gcd_monoid const& lhs, gcd_monoid const& rhs) { return !(lhs == rhs); } value_type const& get() const { return M_x; } }; int main() { size_t n; scanf("%zu", &n); std::vector<intmax_t> a(n); for (auto& ai: a) scanf("%jd", &ai); foldable_queue<gcd_monoid<intmax_t>> q; intmax_t res = n*(n+1)/2; for (size_t il = 0, ir = 0; il < n; ++il) { while (ir < n && (q.fold() + a[ir]).get() != 1) { q.push(a[ir++]); } res -= ir-il; if (ir == il) ++ir; else q.pop(); } printf("%jd\n", res); }