题目

思路

首先按照\(t\)排序!!!!

首先考虑一个暴力\(dp\)

用\(f[i]\)表示前\(i\)个人到达地点所需要的时间。

那么就有如下的转移

\[f_i = min_{1 \le j \le i}(max(f_j,t_i) + max\{w_{j + 1} ... w_i\} * 2)
\]

这样复杂度是\(o(n^2)\)的

考虑优化上面的\(dp\)

因为已经按照\(t\)从小到大排过序了,所以如果\(w_i \le w_{i + 1}\)那么第\(i\)这个人就一定是和第\(i+1\)个人一起跟优秀。所以就可以把第\(i\)人剔除掉。

用单调栈可以完成上面的工作。

现在就变成了一个\(t\)单调递增,\(w\)单调递减的序列

然后再去看上面的\(dp\),我们可以把它分成两段。

\(if(f_j \le t_i)\)

\[f_i=t_i + max\{w_{j+1}...w_i\} * 2
\]

\(if(f_j > t_i)\)

\[f_i = f_j + max\{w_{j+1}...w_i\} * 2
\]

因为\(w\)数组单减,所以上面的式子\(max\{w_{j+1}...w_i\}\)是肯定是\(w_{j+1}\)。

所以上面的\(dp\)式子可以这样写

\(if(f_j \le t_i)\)

\[f_i=t_i + w_{j+1} * 2
\]

\(if(f_j > t_i)\)

\[f_i = f_j + w_{j+1} * 2
\]

因为\(f\)数组是递增的,所以第一种转移肯定一前一部分,第二种转移是后一部分。可以找到他们的分界点\(p\)

对于\(p\)及\(p\)之前的,因为\(t_i\)固定了,所以只要找到最小的\(w_{j + 1}\)就行了。显然\(w_{p+1}\)最小

对于\(p\)之后的,就是要找最小的\(f_j+w_{j+1}*2\),用线段树维护一下。

代码

/*
* @Author: wxyww
* @Date: 2019-03-24 19:59:19
* @Last Modified time: 2019-03-24 20:43:41
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const ll INF = 4e9,N = 1000000 + 100;
#define int ll
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int b[N],top,tree[N << 2], f[N];
struct node {
int p,w;
}a[N];
void update(int rt,int l,int r,int pos,int c) {
if(l == r) {
tree[rt] = c;
return;
}
int mid = (l + r) >> 1;
if(pos <= mid) update(rt << 1,l,mid,pos,c);
else update(rt << 1 | 1,mid + 1,r,pos,c);
tree[rt] = min(tree[rt << 1],tree[rt << 1 | 1]);
}
int query(int rt,int l,int r,int L,int R) {
if(L <= l && R >= r) return tree[rt];
int mid = (l + r) >> 1;
int ans = INF;
if(L <= mid) ans = min(ans,query(rt << 1,l,mid,L,R));
if(R > mid) ans = min(ans,query(rt << 1 | 1,mid + 1,r,L,R));
return ans;
}
bool cmp(const node &A,const node &B) {
return A.p < B.p;
}
signed main() {
int n = read();
for(int i = 1;i <= n;++i) a[i].p = read(),a[i].w = read(); sort(a + 1,a + n + 1,cmp); for(int i = 1;i <= n;++i) {
while(a[i].w >= a[b[top]].w && top) top--;
b[++top] = i;
} int p = 0;
for(int i = 1;i <= top;++i) {
while(p < i - 1 && f[p + 1] <= a[b[i]].p) ++p;
f[i] = a[b[i]].p + a[b[p + 1]].w * 2;
if(p + 1 <= i - 1) f[i] = min(f[i],query(1,1,top,p + 1,i - 1));
update(1,1,top,i,f[i] + a[b[i + 1]].w * 2);
}
cout<<f[top];
return 0;
}

noi.ac89A 电梯的更多相关文章

  1. noi.ac #289. 电梯(单调队列)

    题意 题目链接 Sol 傻叉的我以为给出的\(t\)是单调递增的,然后\(100\rightarrow0\) 首先可以按\(t\)排序,那么转移方程为 \(f[i] = min_{j=0}^{i-1} ...

  2. NOI第一天感想&小结

    嘛...中午总算是到了深圳了--在虹桥机场和飞机上和市队大神们一起讨论各种各样奇(sang)葩(bing)的算(ren)法(lei)还是非常开心的,在此再各种膜拜一下尽管没来比赛的FFT大神@陈中瑞 ...

  3. 自己动手C#模拟电梯的运行V1.0

    电梯调度有很多种模式,参见http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html 1.1先来先服务算法(FCFS) 先来先 ...

  4. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  5. 浮动【电梯】或【回到顶部】小插件:iElevator.js

    iElevator.js 是一个jquery小插件,使用简单,兼容IE6,支持UMD和3种配置方式,比锚点更灵活. Default Options _defaults = { floors: null ...

  6. NOI 动态规划题集

    noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...

  7. noi 6047 分蛋糕

    题目链接:http://noi.openjudge.cn/ch0405/6047/ 和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了.就用循环好了. 状态描叙也可以修改,那个题目 ...

  8. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] --11061188刘强

    结对编程总结 队员:刘强(11061188) 林谋武(11061169) 结对编程: 结对编程的优点: 1.  两个人合作,相比于一个人自己奋斗而言,更能激发自己的潜能:我们在合作过程中,互相学习,互 ...

  9. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

随机推荐

  1. 【译】.NET Core 3.0 中的新变化

    .NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...

  2. 倒计时5S秒自动关闭弹窗

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. webpack4.x笔记-配置基本的前端开发环境(一)

    webpack的基本使用 webpack 本质上是一个打包工具,它会根据代码的内容解析模块依赖,帮助我们把多个模块的代码打包.借用 webpack 官网的图片: 虽然webpack4.x的版本可以零配 ...

  4. 基于geotools的(两个)SHP要素变化提取方法预研

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 我们用遥感的手段进行卫星特征提取.多幅影像间的特征变化提取的 ...

  5. Android View的重绘ViewRootImpl的setView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/ 本篇文章来分析一下WindowManager的后续工作,也就是ViewRootImpl的setView函数的工作 /i* ...

  6. 前端开发之基础知识-HTML(二)

    1.6 html链接 html链接 <a>标签可以在网页上定义一个链接地址,通过src属性定义跳转的地址,通过title属性定义鼠标悬停时弹出的提示文字框. <a href=&quo ...

  7. Git 简单粗暴使用

    1.现在总结一下今天学的两点内容: 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意,可反复多次使用,添 ...

  8. 测试报告_HTMLTestRunner.py

    (1)模板1下载路径: 链接:https://pan.baidu.com/s/1SydXpWwQd5vDpGlzzhXLfA提取码:3ifp (2)模板二下载路径: 链接:https://pan.ba ...

  9. 元数据Metadata

    元数据是什么? 元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置.历史数据. ...

  10. ASP.NET Core 2.1与2.2 SignalR CORS 跨域问题

    将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,本地访问没有问题,但是发布之后一直报跨域问题,本地是这样设置的: Asp.net core 2. ...