题目大意:要煎一块有两个面的肉,只能在一段k不相交的时间段$[l_{i},r_{i}]$内翻转,求$2*n$秒后,保证两个面煎的时间一样长时,需要最少的翻转次数,$n<=100000$,$k<=100$

神仙单调队列优化$DP$, [NOI2005]瑰丽华尔兹 也有类似的压时间段的套路,但这道题可比那道题难多了。

朴素$O(n^2)$的$DP$没什么好说的,我们要想办法把它优化成$O(nk)$的

定义$f[i][j]$表示第$i$个时间段内,朝上的面(现在没被煎的)被煎的时间是$j$

1.观察翻转的过程,貌似在一个连续的时间段内翻转2次以上就是没有意义的 ,因为可以翻过去再翻回来

2.貌似并不一定要在整数时间翻转,但这种情况只在翻转1次的情况下有意义,所以整体把时间*2

然后,分情况讨论$DP$转移

1.翻0次,朝上的面被煎的时间不变,$f[i][j]=f[i-1][j]$,无需任何优化

2.翻2次,朝上的面被至多额外煎$r_{i}+l_{i}$秒,枚举上一次当前面被煎的时间$k$,可得$f[i][j]=min(f[i][k])+2\;(k<=j)$

对于这种情况,正序枚举$j$,单调队列优化$DP$即可,$j-k>r_{i}+l_{i}$的弹出队列

3.翻1次,原来朝上的面被翻到了下面,设现在的上面是$a$面,下面是$b$面,则$a$面被煎了$j$秒,$b$面被煎了$r_{i}-j$秒

那么上一次$a$面被煎的时间是$k$,此时$a$面朝下,朝上的面是$b$面,被煎的时间是$r_{i-1}-k$,可得$f[i][j]=min(f[i-1][r_{i}-k])+1$

因为是$-k$,要倒序枚举$j$,同样用单调队列优化,$k-j>r_{i}+l_{i}$弹出队列即可

虽然空间能开下$O(nk)$,但用滚动数组跑得飞快

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define N 205
#define M 401000
#define dd double
#define inf 0x3f3f3f3f
#define rint register int
using namespace std; int n,K,cnt;
int l[N],r[N],t[N];
int f[][M],que[M]; int main()
{
scanf("%d%d",&n,&K);
for(int i=;i<=K;i++){
scanf("%d%d",&l[i],&r[i]);
t[++cnt]=l[i]<<,t[++cnt]=r[i]<<;
}
memset(f,0x3f,sizeof(f));
f[][]=;int now=,pst=;
n<<=;
for(int i=;i<=cnt;i++)
{
if(i&) continue;
int hd=,tl=;
for(rint j=;j<=t[i];j++)
f[now][j]=inf;
for(rint j=;j<=t[i];j++)
{
f[now][j]=min(f[now][j],f[pst][j]);
while(hd<=tl&&f[pst][j]<=f[pst][que[tl]])
tl--;
que[++tl]=j;
while(hd<=tl&&j-que[hd]>t[i]-t[i-])
hd++;
f[now][j]=min(f[now][j],f[pst][que[hd]]+);
}
hd=,tl=;
for(rint j=t[i];j>=;j--)
{
while(hd<=tl&&f[pst][t[i]-j]<=f[pst][t[i]-que[tl]])
tl--;
que[++tl]=j;
while(hd<=tl&&que[hd]-j>t[i]-t[i-])
hd++;
f[now][j]=min(f[now][j],f[pst][t[i]-que[hd]]+);
}
swap(now,pst);
}
if(f[pst][n]==inf) printf("Hungry\n");
else printf("Full\n%d\n",f[pst][n]);
return ;
}

CF939F Cutlet (单调队列优化DP)的更多相关文章

  1. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  2. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  3. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  4. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  5. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  6. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  7. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  8. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  9. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

随机推荐

  1. 速学JavaScript!

    什么是JavaScript? JavaScript是一种轻量级的脚本语言,也是一种嵌入式语言,是一种对象模型语言,简称JS:JavaScript的核心语法部分(语言本身)很精简,只包括两个部分: 基本 ...

  2. mvc模式开发

  3. sublime text3安装js提示的插件

    今天安装Sublime Text3的js插件,在网上查了很多资料,为了方便以后看,写一个安装插件的总结和方法. 要安装js相关的插件,就要先安装一个Package Control(插件管理器)的插件, ...

  4. HDU 2078 选课时间( 水题 )

    链接:传送门 思路:水题略 /************************************************************************* > File N ...

  5. springmvcjson中文乱码处理

    在sping.xml中增加配置信息 <bean class="org.springframework.web.servlet.mvc.method.annotation.Request ...

  6. spring mvc 下载

    1.代码: response.setContentType("application/msword;charset=GBK"); try { response.setHeader( ...

  7. fetch 如何请求数据

    fetch 如何请求数据 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好 二 与 ...

  8. JS中的DOM操作怎样添加、移除、移动、复制、创建和查找节点

    DOM操作怎样添加.移除.移动.复制.创建和查找节点? (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元 ...

  9. 【hihocoder 1519】 逃离迷宫II

    [题目链接]:http://hihocoder.com/problemset/problem/1519?sid=1098756 [题意] Chinese [题解] bfs题; 根据bfs的性质; 第一 ...

  10. HashMap导致死循环问题

    虽然我推测是链表形成闭环,但 没有去证明过.从网上找了一下: http://blog.csdn.net/autoinspired/archive/2008/07/16/2662290.aspx 里面也 ...