結果
問題 | No.318 学学学学学 |
ユーザー | tarakojo1019 |
提出日時 | 2021-05-26 14:29:03 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 193 ms / 2,000 ms |
コード長 | 8,111 bytes |
コンパイル時間 | 1,649 ms |
コンパイル使用メモリ | 150,836 KB |
実行使用メモリ | 14,336 KB |
最終ジャッジ日時 | 2024-10-15 10:18:30 |
合計ジャッジ時間 | 6,246 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 13 ms
5,248 KB |
testcase_01 | AC | 28 ms
5,376 KB |
testcase_02 | AC | 34 ms
5,888 KB |
testcase_03 | AC | 22 ms
5,248 KB |
testcase_04 | AC | 29 ms
5,632 KB |
testcase_05 | AC | 193 ms
14,208 KB |
testcase_06 | AC | 145 ms
11,264 KB |
testcase_07 | AC | 119 ms
10,240 KB |
testcase_08 | AC | 96 ms
9,216 KB |
testcase_09 | AC | 80 ms
8,704 KB |
testcase_10 | AC | 62 ms
8,192 KB |
testcase_11 | AC | 187 ms
14,336 KB |
testcase_12 | AC | 124 ms
11,264 KB |
testcase_13 | AC | 102 ms
10,368 KB |
testcase_14 | AC | 79 ms
9,344 KB |
testcase_15 | AC | 65 ms
8,704 KB |
testcase_16 | AC | 51 ms
8,064 KB |
testcase_17 | AC | 123 ms
11,264 KB |
testcase_18 | AC | 108 ms
11,264 KB |
testcase_19 | AC | 121 ms
11,136 KB |
testcase_20 | AC | 48 ms
8,064 KB |
testcase_21 | AC | 2 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 2 ms
5,248 KB |
testcase_24 | AC | 2 ms
5,248 KB |
testcase_25 | AC | 2 ms
5,248 KB |
testcase_26 | AC | 2 ms
5,248 KB |
testcase_27 | AC | 2 ms
5,248 KB |
testcase_28 | AC | 1 ms
5,248 KB |
ソースコード
#include <algorithm> #include <array> #include <bitset> #include <cassert> #include <cmath> #include <cstring> #include <deque> #include <fstream> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <stack> #include <string> #include <unordered_map> #include <unordered_set> #include <vector> //#define ENVIRONMENT_LINKED_ACL #ifdef ENVIRONMENT_LINKED_ACL #include <atcoder/lazysegtree> #endif //#define ENVIRONMENT_LINKED_BOOST #ifdef ENVIRONMENT_LINKED_BOOST #include <boost/multiprecision/cpp_dec_float.hpp> #include <boost/multiprecision/cpp_int.hpp> #endif using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; using lpair = std::pair<ll, ll>; #define REP(i, a, b) for (ll i = a; i < b; ++i) #define REPREV(i, a, b) for (ll i = a; i > b; --i) const int _ = []() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); std::cout << std::fixed << std::setprecision(10); return 0; }(); template <typename value_t> void resize(value_t& v, const value_t& val) { v = val; } template <typename vec_t, typename value_t, typename... arg_t> void resize(std::vector<vec_t>& v, const value_t& val, int size, arg_t... arg) { v.resize(size); for (auto& c : v) resize(c, val, arg...); } template <typename A, typename B> void chmin(A& a, const B& b) { a = min(a, static_cast<A>(b)); }; template <typename A, typename B> void chmax(A& a, const B& b) { a = max(a, static_cast<A>(b)); }; //applyは左にかける template <typename T, typename M> struct lazy_segtree { private: std::function<M(M, M)> composition; std::function<T(M, T)> mapping; std::function<T(T, T)> op; std::function<M()> id; std::function<T()> e; std::vector<M> lazy; std::vector<T> dat; long long size; long long log; void update(int ind) { dat[ind] = op(dat[ind << 1 | 0], dat[ind << 1 | 1]); } void node_apply(int ind, const M& m) { dat[ind] = mapping(m, dat[ind]); if (ind < size) lazy[ind] = composition(m, lazy[ind]); } void prop(int ind) { node_apply(ind << 1 | 0, lazy[ind]); node_apply(ind << 1 | 1, lazy[ind]); lazy[ind] = id(); } public: lazy_segtree() : size{0}, log{0} {} lazy_segtree(long long _n, // std::function<T(T, T)> _op, // std::function<T()> _e, // std::function<T(M, T)> _mapping, // std::function<M(M, M)> _composition, // std::function<M()> _id) // : op{_op}, // e{_e}, // mapping{_mapping}, // composition{_composition}, // id{_id} // { size = 1, log = 0; while (size < _n) size <<= 1, ++log; dat.resize(2 * size, e()); lazy.resize(2 * size, id()); } lazy_segtree(const std::vector<T>& _src, // std::function<T(T, T)> _op, // std::function<T()> _e, // std::function<T(M, T)> _mapping, // std::function<M(M, M)> _composition, // std::function<M()> _id) // : op{_op}, // e{_e}, // mapping{_mapping}, // composition{_composition}, // id{_id} // { size = 1, log = 0; while (size < _src.size()) size <<= 1, ++log; dat.resize(2 * size); lazy.resize(2 * size, id()); for (int i = 0; i < _src.size(); ++i) dat[i + size] = _src[i]; } //[l,r) mは左にかける void apply(long long l, long long r, const M& m) { assert(0 <= l && l <= r && r <= size); if (l == r) return; l += size; r += size; for (int i = log; i >= 1; --i) { if ((l >> i) << i != l) prop(l >> i); if ((r >> i) << i != r) prop((r - 1) >> i); } long long a = l, b = r; while (a < b) { if (a & 1) node_apply(a++, m); if (b & 1) node_apply(--b, m); a >>= 1, b >>= 1; } for (int i = 1; i <= log; ++i) { if ((l >> i) << i != l) update(l >> i); if ((r >> i) << i != r) update((r - 1) >> i); } } //O(1) T all_prod() { return dat[1]; } //[l,r) T query(long long l, long long r) { assert(0 <= l && l <= r && r <= size); l += size, r += size; for (int i = log; i >= 1; --i) { if ((l >> i) << i != l) prop(l >> i); if ((r >> i) << i != r) prop((r - 1) >> i); } T tmp_l = e(); T tmp_r = e(); while (l < r) { if (l & 1) tmp_l = op(tmp_l, dat[l++]); if (r & 1) tmp_r = op(dat[--r], tmp_r); l >>= 1, r >>= 1; } return op(tmp_l, tmp_r); } T elem(long long i) { assert(0 <= i && i < size); i += size; for (int j = log; j >= 1; --j) prop(i >> j); return dat[i]; } void set(long long i, const T& value) { assert(0 <= i && i < size); i += size; for (int j = log; j >= 1; --j) prop(i >> j); dat[i] = value; for (int j = 1; j <= log; ++j) update(i >> j); } //x <= rで、cond[x-1, r) = falseとなる最大のx 存在しなければ0 int search_left(long long r, std::function<bool(T)> cond) { assert(0 <= r && r <= size); assert(cond(e())); if (r == 0) return 0; r += size; for (int j = log; j >= 1; --j) prop((r - 1) >> j); T tmp = e(); do { --r; while (r % 2 && r > 1) r >>= 1; T next = op(dat[r], tmp); if (cond(next)) { tmp = next; continue; } while (r < size) { prop(r); r <<= 1; next = op(dat[++r], tmp); if (cond(next)) { --r; tmp = next; } } return r - size + 1; } while ((r & -r) != r); return 0; } //l <= x で、cond(op[l,x+1))=falseとなる最小のx 存在しなければsize int search_right(long long l, std::function<bool(T)> cond) { assert(0 <= l && l <= size); assert(cond(e())); if (l == size) return size; l += size; T tmp = e(); do { while (l % 2 == 0) l >>= 1; T next = op(tmp, dat[l]); if (cond(next)) { ++l; tmp = next; continue; } while (l < size) { prop(l); l <<= 1; next = op(tmp, dat[l]); if (cond(next)) { ++l; tmp = next; } } return l - size; } while ((l & -l) != l); return size; } }; int main() { ll n; cin >> n; vector<ll> A(n); map<ll, lpair> M; REP(i, 0, n) { cin >> A[i]; if (M.count(A[i]) == 0) M[A[i]] = {i, i}; chmax(M[A[i]].second, i); } lazy_segtree<ll, ll> seg{n, [](ll a, ll b) { return a; }, []() { return 0; }, [](ll m, ll a) { return m ? m : a; }, [](ll m1, ll m2) { return m1 ? m1 : m2; }, []() { return 0; }}; for (auto [a, range] : M) { seg.apply(range.first, range.second + 1, a); } REP(i, 0, n) { cout << seg.elem(i); if (i == n - 1) { cout << endl; } else { cout << " "; } } return 0; }