結果

問題 No.1077 Noelちゃんと星々4
ユーザー ____________
提出日時 2020-06-12 21:46:23
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 3,507 bytes
コンパイル時間 2,396 ms
コンパイル使用メモリ 208,820 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-06-24 04:47:14
合計ジャッジ時間 30,521 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 20 ms
6,812 KB
testcase_01 AC 31 ms
6,940 KB
testcase_02 AC 1,926 ms
6,944 KB
testcase_03 TLE -
testcase_04 AC 750 ms
6,944 KB
testcase_05 AC 559 ms
6,944 KB
testcase_06 AC 973 ms
6,944 KB
testcase_07 AC 1,126 ms
6,940 KB
testcase_08 AC 814 ms
6,940 KB
testcase_09 AC 701 ms
6,940 KB
testcase_10 TLE -
testcase_11 AC 1,612 ms
6,940 KB
testcase_12 AC 1,326 ms
6,940 KB
testcase_13 AC 534 ms
6,940 KB
testcase_14 TLE -
testcase_15 AC 1,284 ms
6,944 KB
testcase_16 AC 838 ms
6,940 KB
testcase_17 AC 1,459 ms
6,940 KB
testcase_18 TLE -
testcase_19 AC 508 ms
6,944 KB
testcase_20 AC 5 ms
6,940 KB
testcase_21 TLE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using P = pair<ll,ll>;
using vl = vector<ll>;
using Map = map<ll,ll>;
using Tup = tuple<ll,ll,ll>;
using vvl = vector<vector<ll>>;
#define all(v) v.begin(), v.end()
#define prt(v) cout<<(v)<<"\n";
#define fl cout<<flush;
#define fi(v) get<0>(v)
#define se(v) get<1>(v)
#define th(v) get<2>(v)
#define endl "\n"
template <typename T> bool chmax(T &a, const T &b){if (a<b){a=b;return 1;}return 0;}
template <typename T> bool chmin(T &a, const T &b){if (a>b){a=b;return 1;}return 0;}
const ll INF=1LL<<60;
const ll MOD=1000000007;
const ll MOD2=998244353;
const ld pi=3.141592653589793238;
ll N;
vector<ll> Y(1003,0);

/* RMQ:[0,n-1] について、区間ごとの最小値を管理する構造体
    update(a,b,x): 区間[a,b) の要素を x に更新。O(log(n))
    update(a,x): a番目の要素を x に更新。O(log(n))
    query(a,b): [a,b) での最小の要素を取得。O(log(n))
    get(a): a番目の要素を取得。O(log(n))
*/
template <typename T>
struct RMQ {
    ll n;
    vector<T> dat, lazy;
    RMQ(ll n_) : n(), dat(n_ * 4, INF), lazy(n_ * 4, INF) {
        ll x = 1;
        while (n_ > x) x *= 2;
        n = x;
    }
    /* lazy eval */
    void eval(ll k) {
        if (lazy[k] == INF) return;  // 更新するものが無ければ終了
        if (k < n - 1) {             // 葉でなければ子に伝搬
            lazy[k * 2 + 1] = lazy[k];
            lazy[k * 2 + 2] = lazy[k];
        }
        // 自身を更新
        dat[k] = lazy[k];
        lazy[k] = INF;
    }
    void update(ll a, ll b, T x, ll k, ll l, ll r) {
        eval(k);
        if (a <= l && r <= b) {  // 完全に内側の時
            lazy[k] = x;
            eval(k);
        } else if (a < r && l < b) {                     // 一部区間が被る時
            update(a, b, x, k * 2 + 1, l, (l + r) / 2);  // 左の子
            update(a, b, x, k * 2 + 2, (l + r) / 2, r);  // 右の子
            dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
        }
    }
    void update(ll a, ll b, T x) { update(a, b, x, 0, 0, n); }
    void update(ll a, T x){ update(a, a + 1, x, 0, 0, n); }
    T query_sub(ll a, ll b, ll k, ll l, ll r) {
        eval(k);
        if (r <= a || b <= l) {  // 完全に外側の時
            return INF;
        } else if (a <= l && r <= b) {  // 完全に内側の時
            return dat[k];
        } else {  // 一部区間が被る時
            T vl = query_sub(a, b, k * 2 + 1, l, (l + r) / 2);
            T vr = query_sub(a, b, k * 2 + 2, (l + r) / 2, r);
            return min(vl, vr);
        }
    }
    T query(ll a, ll b) { return query_sub(a, b, 0, 0, n); }
    T get(ll a){ return query_sub(a, a + 1, 0, 0, n); }
    /* debug */
    inline T operator[](ll a) { return query(a, a + 1); }
    void prll() {
        for (ll i = 0; i < 2 * n - 1; ++i) {
            cout << (*this)[i];
            if (i != n) cout << ",";
        }
        cout << endl;
    }
};


signed main(void){
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);
    cin >> N;
    for(ll i=0;i<N;++i)cin>>Y[i];
    //tree[i]は最後がiのやつのコスト最小値
    RMQ<ll> tree(10001);
    tree.update(0,0);
    for(ll i=0;i<N;++i){
        for(ll j=10000;j>=0;--j){
            if(j==0)tree.update(0,tree.get(0)+llabs(Y[i]));
            else 
            tree.update(j,tree.query(0,j+1)+llabs(j-Y[i]));
        }
    }
    prt(tree.query(0,10001))fl

    return 0;
}
0