noi.ac89A 电梯
题目
思路
首先按照\(t\)排序!!!!
首先考虑一个暴力\(dp\)
用\(f[i]\)表示前\(i\)个人到达地点所需要的时间。
那么就有如下的转移
\]
这样复杂度是\(o(n^2)\)的
考虑优化上面的\(dp\)
因为已经按照\(t\)从小到大排过序了,所以如果\(w_i \le w_{i + 1}\)那么第\(i\)这个人就一定是和第\(i+1\)个人一起跟优秀。所以就可以把第\(i\)人剔除掉。
用单调栈可以完成上面的工作。
现在就变成了一个\(t\)单调递增,\(w\)单调递减的序列
然后再去看上面的\(dp\),我们可以把它分成两段。
\(if(f_j \le t_i)\)
\]
\(if(f_j > t_i)\)
\]
因为\(w\)数组单减,所以上面的式子\(max\{w_{j+1}...w_i\}\)是肯定是\(w_{j+1}\)。
所以上面的\(dp\)式子可以这样写
\(if(f_j \le t_i)\)
\]
\(if(f_j > t_i)\)
\]
因为\(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 电梯的更多相关文章
- noi.ac #289. 电梯(单调队列)
题意 题目链接 Sol 傻叉的我以为给出的\(t\)是单调递增的,然后\(100\rightarrow0\) 首先可以按\(t\)排序,那么转移方程为 \(f[i] = min_{j=0}^{i-1} ...
- NOI第一天感想&小结
嘛...中午总算是到了深圳了--在虹桥机场和飞机上和市队大神们一起讨论各种各样奇(sang)葩(bing)的算(ren)法(lei)还是非常开心的,在此再各种膜拜一下尽管没来比赛的FFT大神@陈中瑞 ...
- 自己动手C#模拟电梯的运行V1.0
电梯调度有很多种模式,参见http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html 1.1先来先服务算法(FCFS) 先来先 ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- 浮动【电梯】或【回到顶部】小插件:iElevator.js
iElevator.js 是一个jquery小插件,使用简单,兼容IE6,支持UMD和3种配置方式,比锚点更灵活. Default Options _defaults = { floors: null ...
- NOI 动态规划题集
noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...
- noi 6047 分蛋糕
题目链接:http://noi.openjudge.cn/ch0405/6047/ 和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了.就用循环好了. 状态描叙也可以修改,那个题目 ...
- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] --11061188刘强
结对编程总结 队员:刘强(11061188) 林谋武(11061169) 结对编程: 结对编程的优点: 1. 两个人合作,相比于一个人自己奋斗而言,更能激发自己的潜能:我们在合作过程中,互相学习,互 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
随机推荐
- 【译】.NET Core 3.0 中的新变化
.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...
- 倒计时5S秒自动关闭弹窗
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- webpack4.x笔记-配置基本的前端开发环境(一)
webpack的基本使用 webpack 本质上是一个打包工具,它会根据代码的内容解析模块依赖,帮助我们把多个模块的代码打包.借用 webpack 官网的图片: 虽然webpack4.x的版本可以零配 ...
- 基于geotools的(两个)SHP要素变化提取方法预研
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 我们用遥感的手段进行卫星特征提取.多幅影像间的特征变化提取的 ...
- Android View的重绘ViewRootImpl的setView方法
博客首页:http://www.cnblogs.com/kezhuang/p/ 本篇文章来分析一下WindowManager的后续工作,也就是ViewRootImpl的setView函数的工作 /i* ...
- 前端开发之基础知识-HTML(二)
1.6 html链接 html链接 <a>标签可以在网页上定义一个链接地址,通过src属性定义跳转的地址,通过title属性定义鼠标悬停时弹出的提示文字框. <a href=&quo ...
- Git 简单粗暴使用
1.现在总结一下今天学的两点内容: 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file>,注意,可反复多次使用,添 ...
- 测试报告_HTMLTestRunner.py
(1)模板1下载路径: 链接:https://pan.baidu.com/s/1SydXpWwQd5vDpGlzzhXLfA提取码:3ifp (2)模板二下载路径: 链接:https://pan.ba ...
- 元数据Metadata
元数据是什么? 元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置.历史数据. ...
- ASP.NET Core 2.1与2.2 SignalR CORS 跨域问题
将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,本地访问没有问题,但是发布之后一直报跨域问题,本地是这样设置的: Asp.net core 2. ...