题目链接:http://codevs.cn/problem/3342/

题解:

最小化最大值:二分

二分最长空题段

令f[i]表示抄第i道题所花费的最小时间

状态转移方程:f[i]=min(f[j])+time[i]    max(0,i-mid-1)<=j<=i-1

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 50001
using namespace std;
int n,t,l,r,mid,ans,f[N],a[N];
inline bool check(int k)
{
memset(f,,sizeof(f));
f[]=;
for(int i=;i<=n;i++)
for(int j=max(i-k-,);j<i;j++)
f[i]=min(f[i],f[j]+a[i]);
int tmp=0x7fffffff;
for(int i=n-k;i<=n;i++) tmp=min(tmp,f[i]);
if(tmp<=t) return true;
return false;
}
int main()
{
scanf("%d%d",&n,&t);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
l=,r=n;
while(l<=r)
{
mid=l+r>>;
if(check(mid)) {ans=mid;r=mid-;}
else l=mid+;
}
printf("%d",ans);
}

用线段树维护区间最小值,就可以直接查询[i-mid-1,i-1]内的最小值

#include<cstdio>
#include<algorithm>
#define N 50001
#define INF 100000010
using namespace std;
int n,t,ql,qr,mid,ans,f[N],a[N];
struct node{int l,r,key;}tr[N*];
inline int read()//读入优化
{
int x=;char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') {x=x*+c-'';c=getchar();}
return x;
}
inline void begin(int k,int l,int r)//初始化
{
tr[k].key=INF;
if(l==r) return;
int mid=l+r>>;
begin(k<<,l,mid);
begin((k<<)+,mid+,r);
}
inline int query(int k,int opl,int opr)//区间查询
{
if(tr[k].l>=opl&&tr[k].r<=opr) return tr[k].key;
int mid=tr[k].l+tr[k].r>>;
{
int ll=INF;if(opl<=mid) ll=query(k<<,opl,opr);
int rr=INF;if(opr>mid) rr=query((k<<)+,opl,opr);
return min(ll,rr);
}
}
inline void change(int k,int x,int y)//单点修改
{
if(tr[k].l==tr[k].r) {tr[k].key=min(tr[k].key,y);return;}
int mid=tr[k].l+tr[k].r>>;
if(x<=mid) change(k<<,x,y);
else change((k<<)+,x,y);
tr[k].key=min(tr[k<<].key,tr[(k<<)+].key);
}
inline bool check(int k)
{
begin(,,n);
change(,,);
for(int i=;i<=n;i++)
{
int p=query(,max(,i-k-),i-);
change(,i,p+a[i]);
}
int tmp=0x7fffffff;
if(query(,n-k,n)<=t) return true;
return false;
}
inline void build(int k,int l,int r)//建树
{
tr[k].l=l;tr[k].r=r;
if(l==r) return;
int mid=l+r>>;
build(k<<,l,mid);
build((k<<)+,mid+,r);
}
int main()
{
scanf("%d%d",&n,&t);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build(,,n);
ql=,qr=n;
while(ql<=qr)
{
mid=ql+qr>>;
if(check(mid)) {ans=mid;qr=mid-;}
else ql=mid+;
}
printf("%d",ans);
}

讲题专用——线段树——优化DP的更多相关文章

  1. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  2. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  3. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  4. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

  5. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  6. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  7. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  8. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  9. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

随机推荐

  1. 认识MicroBit

    MicroBit是BBC(英国广播公司),为孩子们推出一款开发板,或者叫控制板,可以简单地理解为通过这块电子板,可以控制接在其外围的电子模板,可以读入数据,也可以输出数据,模拟的或数字的数据.这样一来 ...

  2. windowserver -------- 修改服务器防火墙

    再服务器中安装好软件的时候,我们通过别的电脑来访问服务器中的软件的时候,会出现访问不了的情况,这是可能是因为服务器中的防火墙中的进站端口,没有开放,一般软件进行部署的时候会开放801到 810 之间的 ...

  3. jsplumb 初识

    Jsplumb官网:https://jsplumbtoolkit.com GitHub:https://github.com/sporritt/jsplumb/    有很多官网示例 基础教程:htt ...

  4. Redis(六)Lua脚本的支持

    Redis为什么需要Lua脚本的支持 当应用需要Redis完成一些Redis命令不支持的特性时,要么扩展Redis client或者更甚至编写c扩展Redis server.这都大大造成了应用的实现的 ...

  5. EOF的意义及用法

    c/c++ 中EOF的意义及用法 EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束. 在微软的DOS和Windows中,读取数据时终端不会产生EOF.此时,应用程序知道数 ...

  6. Redis配置过程中的问题

    记录一下配置过程中的坑~~ 当Redis在服务器上安装完成后,get.set没有问题了,接下来在程序中使用看看... 首先 在配置文件redis.conf中,默认的bind 接口是127.0.0.1, ...

  7. 英语dialogite红纹石dialogite菱锰矿

    红纹石又称菱锰矿(dialogite)属于三方晶系.晶体呈菱面体,通常呈粒状.块状或结核状.玫瑰色,容易氧化而转变成褐黑色.玻璃光泽.解理平行菱面体{1011}完全.硬度3.5-4.5.比重3.6-3 ...

  8. Vue递归组件实现层层嵌套显示数据

    问题来自朋友...记录一下 需求是表格头部后端返回的数据中是不确定的 n维数据,表头存在于 listVo 字段中,如何实现层层显示呢? 温馨提示,以下内容为5张大图,请打开 WIFI 享用... 以下 ...

  9. rollup入门

    作为js程序员,掌握rollup是必要的. 有了webpack后,为什么还要用rollup, 因为webpack不专业,webpack是打包一切. rollup只为打包js而生. rollup通过的五 ...

  10. GOJS的使用

    项目当中要求表与表之间建立关联关系,需要用到Gojs(只想说这是个什么?),以前完全没接触过gojs,所以记录下使用中的技巧和方法 http://www.devtalking.com/articles ...