题目链接: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. Extra:Cg Math Functions

    常用Cg函数 数学函数 abs(x):绝对值 // float类型的实现 float abs(float x) { return max(-a, a); } sin(x):正弦,输入为弧度 // fl ...

  2. CF1200D 【White Lines】

    退役快一年了之后又打了场紧张刺激的$CF$(斜眼笑) 然后发现$D$题和题解里的大众做法不太一样 (思路清奇) 题意不再赘述,我们可以看到这个题~~好做~~在只有一次擦除机会,尝试以此为突破口解决问题 ...

  3. python]用eval强制将字符串转换为字典变量时候出错:NameError: name 'null' is not defined[python]用eval函数 字符串转dict

    本博客已搬家至个人网站 在路上 - On the way 下面的 技术 分类. 你可以通过点击 更新帖子 [已解决]Python中,用eval强制将字符串转换为字典变量时候出错:NameError: ...

  4. W tensorflow/core/util/ctc/ctc_loss_calculator.cc:144] No valid path found 或 loss:inf的解决方案

    基于Tensorflow和Keras实现端到端的不定长中文字符检测和识别(文本检测:CTPN,文本识别:DenseNet + CTC),在使用自己的数据训练这个模型的过程中,出现如下错误,由于问题已经 ...

  5. kafka在zookeeper创建使用了哪些znode节点?

    我们都知道kafka利用zookeeper做分布式管理,具体创建使用了哪些znode节点呢? 答案均在源码的ZkData.scala文件中,具体路径如下: https://github.com/apa ...

  6. SQLServer之列数据转换为行数据

    UNPIVOT特点 UNPIVOT运算符通过将列旋转到行来执行PIVOT的反向操作,UNPIVOT 并不完全是 PIVOT 的逆操作. PIVOT 执行聚合,并将多个可能的行合并为输出中的一行.UNP ...

  7. 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历

    基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...

  8. Centos中编辑php扩展库

    今天需要在Centos中编译Exif库以便获取图片的exif信息,可在Linux中从来没有编译过扩展库呀,只好查资料了.发现是用phpize这个东东来编译扩展. 首先执行了下 php -i | gre ...

  9. tkinter的单选Radiobutto

    from tkinter import * def printSelection(): num = var.get() if num == 1: lab.config(text="你是男生& ...

  10. 开发技术-IPython介绍

    开发技术-IPython介绍 IPython是交互式的Python命令行,希望大家喜欢. 最近在回顾之前学习的内容,并且继续学习新的知识.这种自身的感觉,很不一般,有太多的感想产生.希望自己可以坚持将 ...