結果
問題 | No.318 学学学学学 |
ユーザー |
![]() |
提出日時 | 2017-02-20 17:38:02 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 151 ms / 2,000 ms |
コード長 | 1,853 bytes |
コンパイル時間 | 1,014 ms |
コンパイル使用メモリ | 89,568 KB |
実行使用メモリ | 18,544 KB |
最終ジャッジ日時 | 2024-06-22 18:09:55 |
合計ジャッジ時間 | 4,169 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <iostream>#include <map>#include <vector>#include <algorithm>using namespace std;typedef long long ll;const int MAX_N = 1 << 17;const int def = 0;const int INF = 1 << 25;struct SumSegTree3 {int n;struct S {bool flag;ll dat;S() : dat(0), flag(false) {}};S node[2 * MAX_N - 1];void init(int n_) {n = 1;while(n < n_) n *= 2;}void propagate(int k) {if(!node[k].flag) return;node[k].flag = false;if(2 * k + 1 < 2 * n - 1) {S& t = node[k];S& l = node[2 * k + 1];S& r = node[2 * k + 2];l.flag = r.flag = true;l.dat = r.dat = t.dat / 2;}}void update(int a, int b, ll x) { update(a, b, x, 0, 0, n); }void update(int a, int b, ll x, int k, int l, int r) {propagate(k);if(r <= a || b <= l) return;if(a <= l && r <= b) {node[k].dat = (r - l) * x;node[k].flag = true;propagate(k);return;}update(a, b, x, k * 2 + 1, l, (l + r) / 2);update(a, b, x, k * 2 + 2, (l + r) / 2, r);// mergenode[k].dat = node[2 * k + 1].dat + node[2 * k + 2].dat;}ll query(int a, int b) { return query(a, b, 0, 0, n); }ll query(int a, int b, int k, int l, int r) {propagate(k);if(r <= a || b <= l) return 0;if(a <= l && r <= b) return node[k].dat;ll vl = query(a, b, k * 2 + 1, l, (l + r) / 2);ll vr = query(a, b, k * 2 + 2, (l + r) / 2, r);return vl + vr;}};SumSegTree3 st;int main() {cin.tie(0);ios::sync_with_stdio(false);int N;cin >> N;st.init(N);map<int, vector<int>> m;for(int i = 0; i < N; i++) {int a;cin >> a;st.update(i, i + 1, a);m[a].push_back(i);}for(auto& v : m) {vector<int>& a = v.second;sort(a.begin(), a.end());int l = a.front(), r = a.back();st.update(l, r + 1, v.first);}for(int i = 0; i < N; i++) {cout << st.query(i, i + 1) << " ";}cout << endl;}