답안 #761195

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
761195 2023-06-19T10:54:18 Z ksu2009en Peru (RMI20_peru) C++17
0 / 100
1 ms 340 KB
#include "peru.h"
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <numeric>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <cstring>
#include <unordered_map>

using namespace std;
typedef int ll;

ll const mod = (ll)(1e9 + 7);

struct one{
    ll res, min_dp, mx, mod;
};

one t[4 * 2500000 + 7];

void build(ll v, ll l, ll r){
    if(l == r){
        t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
        t[v].mod = -1;
        return;
    }
    ll mid = (l + r) >> 1;
    
    build(2 * v, l, mid);
    build(2 * v + 1, mid + 1, r);
    
    t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
    t[v].mod = -1;
}

void push(ll v, ll l, ll r){
    if(l != r && t[v].mod != -1){
        //cout << "  pushing " << l << ' ' << r << ' ' << t[v].mod << endl;
        t[2 * v].mod = max(t[2 * v].mod, t[v].mod);
        t[2 * v].res = t[2 * v].min_dp + t[2 * v].mod;
        
        //cout << " left son val :::::::: " << l << ' ' << r << ' ' << t[2 * v].res << endl;
        
        t[2 * v + 1].mod = max(t[2 * v + 1].mod, t[v].mod);
        t[2 * v + 1].res = t[2 * v + 1].min_dp + t[2 * v + 1].mod;
        
        t[v].mod = -1;
    }
}

void update_dp(ll v, ll l, ll r, ll pos, ll val, ll mx){
    if(l == r){
        t[v].min_dp = val;
        t[v].res = val + mx;
        t[v].mod = mx;
        
        //cout << "    update_dp " << l << ' ' << r << ' ' << t[v].res << ' ' << t[v].min_dp << endl;
        
        return;
    }
    
    ll mid = (l + r) >> 1;
    push(v, l, r);
    
    if(pos <= mid)
        update_dp(2 * v, l, mid, pos, val, mx);
    else
        update_dp(2 * v + 1, mid + 1, r, pos, val, mx);
    
    t[v].res = min(t[2 * v].res, t[2 * v + 1].res);
    //cout << l << ' ' << mid << ' ' << t[2 * v].res << endl;
    //cout << "    update_dp " << l << ' ' << r << ' ' << t[v].res  << ' ' << pos << ' ' << val << ' ' << mx << endl;

    t[v].min_dp = min(t[2 * v].min_dp, t[2 * v + 1].min_dp);
}

void update_mx(ll v, ll l, ll r, ll ql, ll qr, ll mx){
    if(r < ql || qr < l)
        return;
    
    if(ql <= l && r <= qr){
        t[v].mod = max(t[v].mod, mx);
        t[v].res = t[v].min_dp + t[v].mod;
      //  cout << l << ' ' << r << ' ' << t[v].mod << endl;

        return;
    }
    
    ll mid = (l + r) >> 1;
    push(v, l, r);
    update_mx(2 * v, l, mid, ql, qr, mx);
    update_mx(2 * v + 1, mid + 1, r, ql, qr, mx);
    
    t[v].res = min(t[2 * v].res, t[2 * v + 1].res);
    t[v].min_dp = min(t[2 * v].min_dp, t[2 * v + 1].min_dp);
}

ll get_min(ll v, ll l, ll r, ll ql, ll qr){
    if(r < ql || qr < l)
        return (ll)(2500000) * (ll)(2000000000) + 1;
    
    if(ql <= l && r <= qr){
      //  cout << "geting getting getting getiing getting " << l << ' ' << r << ' ' << t[v].res << endl;
        return t[v].res;
    }
    
    ll mid = (l + r) >> 1;
    push(v, l, r);
    
    return min(get_min(2 * v, l, mid, ql, qr), get_min(2 * v + 1, mid + 1, r, ql, qr));
}

int solve(int n, int k, int* b){
    vector<ll>dp(n + 1), a(n + 1);
    for(int i = 0; i < n; i++)
        a[i + 1] = b[i];
    
    build(1, 1, n);
    
    dp[1] = a[1];
    update_dp(1, 1, n, 1, 0, a[1]);
    
    for(int i = 2; i <= n; i++){
        dp[i] = (dp[i - 1] + (ll)a[i]);
        update_dp(1, 1, n, i, dp[i - 1], a[i]);
        
        
        ll mx = 0;
        ll last = 1;
        
        for(int j = i - 1; j >= max(0, i - k + 1); j--){
            mx = max(mx, (ll)a[j]);
            if(mx > a[i]){
                last = j + 1;
                break;
            }
        }
       // cout << "LAST " << last << endl;
        if(last <= i - 1)
            update_mx(1, 1, n, last, i - 1, a[i]);
        
       // cout << get_min(1, 1, n, i - k + 1, i) << endl;

        dp[i] = get_min(1, 1, n, i - k + 1, i);
    }
    
    
    ll p = 1;
    
    ll ans = 0;
    for(int i = n; i >= 1; i--){
        dp[i] %= mod;
        
        ans = (ans + (p * dp[i]) % mod) % mod;
        
        p = (p * 23) % mod;
    }
    
    
    return ans;
}

Compilation message

peru.cpp: In function 'void build(ll, ll, ll)':
peru.cpp:33:58: warning: integer overflow in expression of type 'll' {aka 'int'} results in '937459712' [-Woverflow]
   33 |         t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
      |                                            ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
peru.cpp:42:54: warning: integer overflow in expression of type 'll' {aka 'int'} results in '937459712' [-Woverflow]
   42 |     t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
      |                                        ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
peru.cpp: In function 'll get_min(ll, ll, ll, ll, ll)':
peru.cpp:110:30: warning: integer overflow in expression of type 'll' {aka 'int'} results in '937459712' [-Woverflow]
  110 |         return (ll)(2500000) * (ll)(2000000000) + 1;
      |                ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -