結果
| 問題 |
No.860 買い物
|
| コンテスト | |
| ユーザー |
kagasan
|
| 提出日時 | 2019-10-08 20:21:46 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,211 bytes |
| コンパイル時間 | 2,150 ms |
| コンパイル使用メモリ | 181,656 KB |
| 実行使用メモリ | 13,636 KB |
| 最終ジャッジ日時 | 2024-11-07 15:59:28 |
| 合計ジャッジ時間 | 9,355 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 TLE * 1 -- * 6 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
#define rep(i, n) for(ll (i) = 0; (i) < (n); (i)++)
#define rep1(i, n) for(ll (i) = 1; (i) <= (n); (i)++)
#define rrep(i, n) for(ll (i) = (n) - 1; (i) >= 0; (i)--)
#define rrep1(i, n) for(ll (i) = (n); (i) >= 1; (i)--)
const ll INF = 1145141919;
const ll MOD = 1000000007;
template<class T> void chmax(T &a, const T &b){if(a < b){a = b;}}
template<class T> void chmin(T &a, const T &b){if(a > b){a = b;}}
class RMQ{
public:
int N;
ll MAX;
vector<ll>dat;
RMQ(int n, ll x){
N = 1;
while(N < n)N *= 2;
dat = vector<ll>(2 * N);
for(int i = 0; i < 2 * N - 1; i++)dat[i] = x;
MAX = (1ll) << 62;
}
void update(int k, ll x){
k += N - 1;
dat[k] = x;
while(k > 0){
k = (k - 1) / 2;
dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
}
}
// [a, b)
ll query(int a, int b, int k, int l, int r){
if(r <= a || b <= l)return MAX;
if(a <= l && r <= b)return dat[k];
else{
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 min(vl, vr);
}
}
ll query(int a, int b){
return query(a, b, 0, 0, N);
}
};
int main(){
ll N;
cin >> N;
vector<ll>A(N + 1), B(N + 1);
rep1(i, N)cin >> A[i] >> B[i];
ll ans = 0;
rep1(i, N)ans += A[i];
for(ll i = 2; i <= N; i++)ans += B[i];
RMQ rmq(N + 10, 0);
rep1(i, N)rmq.update(i, A[i]);
ans += rmq.query(1, N + 1);
queue<P>Q;
Q.push(P(1, N));
while(!Q.empty()){
ll l = Q.front().first;
ll r = Q.front().second;
Q.pop();
if(l == r)continue;
ll tmp = 0;
ll l_r;
for(ll i = l; i + 1 <= r; i++){
ll hoge = rmq.query(l, i + 1) + rmq.query(i + 1, r + 1) - rmq.query(l, r + 1) - B[i + 1];
if(hoge < tmp){
tmp = hoge;
l_r = i;
}
}
if(tmp == 0)continue;
ans += tmp;
Q.push(P(l, l_r));
Q.push(P(l_r + 1, r));
}
cout << ans << endl;
return 0;
}
kagasan