书架

题目描述

由于最近又购买了很多书,所以你打算在自己的书房做一个新书架,但是由于墙体高度有限,并且为了照顾整体效果,你希望你的书架的宽度越小越好,所谓宽度就是指书架在垂直方向上占据的距离。

现按一定顺序给出所有要放置于书架上的书,要求求书架的最小宽度。每本书都有一个长度,而书架是「目」字形的,一层的宽度不能小于其上所摆放的任何一本书的长度。每本书的重量和它的长度成正比,而每层书架都有同样的最大承重,简单起见,换算成长度单位,记为m,也就是说每层上的书的长度之和不得超过m。整个书架的宽度为其上所有层的宽度之和。为了便于查找,任何层上的书必须为给出的书中的连续几本。

输入输出格式

输入格式:
第一行有两个正整数n、m。接下来有n行,每行一个正整数hi,i从1到n,hi ≤ m。

输出格式:
共一行,一个整数表示书架的最小宽度。

输入输出样例
输入样例#1: 复制
4 6
1
3
3
1
输出样例#1: 复制
5

说明
对于30%的数据,n ≤ 1,000
对于100%的数据,n ≤ 100,000,hi ≤ 10,000,m ≤ 1,000,000,000
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define imin(a,b) ((a<b)?(a):(b))
#define imax(a,b) ((a>b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=100100;
const ll inf=1e9;
const int mp=17;
int n,m;
int d[N],la[N];
int l,r;
ll sum[N],f[N],qx[N<<1],qy[N<<1];
ll h1[N],h2[N];
int cnt1,cnt2;
void add1(ll x) {
    cnt1++; h1[cnt1]=x;    int now=cnt1;
    while((now>1) && (h1[now>>1]>h1[now])) { swap(h1[now>>1],h1[now]); now>>=1;    }}
void down1() {
    h1[1]=h1[cnt1]; cnt1--;    int now=1;
    while((now<<1)<=cnt1) {
        int uw;    if((now<<1|1)>cnt1) uw=now<<1; else uw=(h1[now<<1]<h1[now<<1|1])?(now<<1):(now<<1|1);
        if(h1[now]>h1[uw]) swap(h1[now],h1[uw]); else break; now=uw; }}
void add2(int x) {
    cnt2++; h2[cnt2]=x;    int now=cnt2;
    while((now>1) && (h2[now>>1]>h2[now])) { swap(h2[now>>1],h2[now]); now>>=1; }}
void down2() {
    h2[1]=h2[cnt2]; cnt2--;    int now=1;
    while((now<<1)<=cnt2) {
        int uw; if((now<<1|1)>cnt2) uw=now<<1; else uw=(h2[now<<1]<h2[now<<1|1])?(now<<1):(now<<1|1);
        if(h2[now]>h2[uw]) swap(h2[now],h2[uw]); else break; now=uw; }}
ll getans()
{
    while(cnt2 && h1[1]==h2[1]) down1(),down2();
    return h1[1];
}
void read(int &x)
{
    x=0; char ch=getchar();
    while(ch<'0' && ch>'9') ch=getchar();
    while(ch>='0' && ch<='9')
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
}
int main()
{
    read(n); read(m); sum[0]=0ll;
    for(int i=1;i<=n;i++) read(d[i]),sum[i]=sum[i-1]+d[i];
    int la=1; l=N; r=N-1;
    for(int i=1;i<=n;i++)
    {
        while(sum[i]-sum[la-1]>m)
        {
            if(r>=l && qx[l]==la) add2(f[la-1]+qy[l]),l++;
            la++;
        }
        if(l>r || qx[l]!=la)
        {
            l--;
            if(la==i) qy[l]=d[i];
            else qy[l]=imax(qy[l],d[i]);
            qx[l]=la;
            add1(f[la-1]+qy[l]);
        }
        int p=i;
        while(r>=l && qy[r]<=d[i])
        {
            p=qx[r];
            add2(f[qx[r]-1]+qy[r]);
            r--;
        }
        qx[++r]=p; qy[r]=d[i];
        add1(f[p-1]+d[i]);
        f[i]=getans();
    }
    printf("%lld\n",f[n]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文档管理精灵-电子书架 功能简介 相信朋友你的各种各样的文档资料也不少吧,面对一大堆的资料,如何去管理它?如何很快地从自己的一大堆资料中找出需要的主题内容?不用愁,有了电子书架,一切的烦恼都会离你而去。言归正传,就让我们来看看她是一个什么样的一个东东吧。 适合对象 电子书架用于文档管理,所以适合于以下人员:网上";;;拾贝者";;;截取保存网上信息、文秘工作者管理重要档案、新闻媒体工作者保存书面信息、能进行计算机操作的学生作笔记、教师备课、各种科技人员撰写保存论文、游戏攻略收集者、炒股人员保存股市信息...等等...以及各种需要进行文档管理的信息工作者;但由于电子书架的特殊功用,所以又适合于以下人员:程序员、网站站长管理制作网页、机密档案管理员。 功能特点 电子书架的功能特点是:快速的资料截取、迅捷的资料查找、清晰的资料管理、丰富的格式转换、方便的电子书制作、安全的资料保存、多用户支持、Delphi及VB代码文本格式化等等,具体功能特点如下: 资料即取即存 电子书架为您收集资料预备了一个很实用的功能,就是";;;即取即存";;;,您所要做的仅仅是";;;复制";;;,操作就是这么简单。您只要开启电子书架,点一下菜单[工具]->[监视剪贴板],或者就按F7,好了,你在任何地方复制或剪切的资料都会被电子书架所收集并保存,并智能建立标题,不管你复制的是纯文本、漂亮的RTF格式文本、还是HTML网页,电子书架都为你忠实地保存下来。当然你也可以在这几种格式之间转化切换。你只要看到什么有用就复制一下,电子书架会自动为你保存,不用麻烦您高贵的手再去粘贴,避免了Windows常规操作时又复制又粘贴地频繁在各窗口间切换的烦琐,非常方便于您截取有价值的资料。你如果把电子书架最小化了(可以隐藏于系统栏),那么就更酷了,打个比方,电子书架就象是你办公室里灵巧的小秘,你只要复制你所要的,她就会把你的内容接管过去保存起来。 资料迅速查找 可以查标题、可以查内容;可以精确查找、可以模糊查找;可以逐个查找、可以批量查找;可以在当前目录位置查找、也可以在全库中搜索。与此同时,为了更方便迅速地找到需要的文档,电子书架为你设置了20个书签,使您能在常要查找的目录之间迅速跳转; 资料交流 电子书架内置了Email功能,您可以随时将资料库中的内容E-Mail给您的朋友,也可以带上附件;设有好友通讯录; 网址收藏 无论您在哪里复制一下网址,Collector就会问你要不要保存这个网址,并保存为HTML格式,建立链接。当然,您如果认为这个讨厌,您也可以关闭这个功能(只要不监视就可以了); IE安全恢复 在网上取一些资料时,鉴于有个别网站为了打响自己,私自修改用户Internet Explorer默认页及标题设置,并锁定注册表、禁用默认页修改,开机自动进入其网站。在电子书架中增加了IE安全恢复的功能,如果您的Internet Explorer已经被修改,可以用恢复功能恢复到默认设置(其实是三脚猫功夫,只不过是修改注册表而已); 多格式支持 电子书架支持的TXT、RTF、HTML等多种格式,所以,可以根据个人需要变化多样,非常漂亮。参见:《附录》-《电子书架范本》中的示例效果; 多格式间转换 可以在电子书架支持的TXT、RTF、HTML等格式之间编辑及相互转化,具备批量文件格式转化功能,您可以批量转换磁盘上的文件,可作为HTML自动生成、文本格式转换、小型Internet浏览工具;同时您也可以调用外部的任何一个文本编辑器(如WordPad、Microsoft Word)、网页编辑程序来对文档或者网页进行编辑,调用Microsoft Word方便您插入各种字符和表格(表格插入功能不完善);RTF-HTML转换功能,可以把存在于电子书架中的资料导出为HTML文件,导出后格式不会丢失; 编码转换 支持在BIG5和GB之间、DOS、UNIX之间相互转化,也可作为一个码制转换工具使用; 资料导入 支持鼠标拖放导入操作,您可以把文件或者文件夹拖入到电子书架内,文件或者文件夹的内容就会按照您的设置被导入,导入时智能判断BIG、HTML格式; 资料导出、电子书制作、批量网页制作 您存放在电子书架内的资料可以方便地导出为TXT纯文本文件、RTF多格式文档、HTML网页文件、Windows帮助格式的CHM文件、甚至CHM工程文件组。可以批量导出,导出生成的HTML文件自动建立索引页。这个功能使得电子书架将来有可能成为电子书制作、批量网页制作、批量文件生成的一个好工具; 光碟目录管理 这一个功能实在简陋,没有什么特色。功能是

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值