| 记录编号 |
608019 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
4000.电梯 |
最终得分 |
100 |
| 用户昵称 |
淮淮清子 |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.348 s |
| 提交时间 |
2025-10-22 15:37:38 |
内存使用 |
4.38 MiB |
显示代码纯文本
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define ls (p << 1)
#define rs (p << 1 | 1)
#define INF 1e18
const int MAXN = 1e5 + 5;
int n, cnt, st[MAXN], top;
ll t1[MAXN], a1[MAXN];
ll t[MAXN], a[MAXN];
ll f[MAXN];
struct Tree{
int l, r;
ll minx[2];
}tr[MAXN << 2];
void pushup(int p){
tr[p].minx[0] = min(tr[ls].minx[0], tr[rs].minx[0]);
tr[p].minx[1] = min(tr[ls].minx[1], tr[rs].minx[1]);
}
void build(int p, int l, int r){
tr[p].l = l, tr[p].r = r;
tr[p].minx[0] = tr[p].minx[1] = INF;
if(l == r) return;
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
}
void change(int p, int pos, ll val, int o){
if(tr[p].l == tr[p].r){
tr[p].minx[o] = val;
return;
}
int mid = (tr[p].l + tr[p].r) >> 1;
if(pos <= mid) change(ls, pos, val, o);
else change(rs, pos, val, o);
pushup(p);
}
ll query(int p, int L, int R, int o){
if(tr[p].r < L || tr[p].l > R) return INF;
if(L <= tr[p].l && tr[p].r <= R) return tr[p].minx[o];
return min(query(ls, L, R, o), query(rs, L, R, o));
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for(int i = 1;i <= n;i ++) cin >> t1[i] >> a1[i];
for(int i = 1;i <= n;i ++){
while (top && a1[st[top]] <= a1[i]) top--;
st[++top] = i;
}
cnt = top;
for(int i = 1; i <= cnt;i ++){
t[i] = t1[st[i]];
a[i] = a1[st[i]];
}
a[cnt + 1] = 0;
fill(f + 1, f + cnt + 1, INF);
f[0] = 0;
if(cnt > 1) build(1, 1, cnt - 1);
for(int i = 1;i <= cnt;i ++){
ll res = INF;
res = min(res, max(f[0], t[i]) + 2 * a[1]);
int l = 1, r = i - 1, p = 0;
while(l <= r){
int mid = (l + r) >> 1;
if (f[mid] <= t[i]) p = mid, l = mid + 1;
else r = mid - 1;
}
if(cnt > 1 && 1 <= p) res = min(res, t[i] + query(1, 1, p, 0));
if(cnt > 1 && p + 1 <= i - 1) res = min(res, query(1, p + 1, i - 1, 1));
f[i] = res;
if(i < cnt){
change(1, i, 2 * a[i + 1], 0);
change(1, i, f[i] + 2 * a[i + 1], 1);
}
}
cout << f[cnt] << '\n';
return 0;
}