这是一道我题解都差点没看懂的题目,DP和线段树融合的出神入化
注释应该写的挺清楚

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define lch(x) x<<1
#define rch(x) x<<1|1
#include<cmath>
using namespace std;
const int maxn = 1e5+5;
typedef long long ll;
struct node{int l,r;ll g,sum;// g为原先的dp值,sum为此次所求值 ll hm,hs;// hm为高度最大值 hs为高度最小值
}tr[maxn*4];
ll h[maxn],L[maxn],lazy[maxn*4];void pushup(int k){ tr[k].hm=max(tr[lch(k)].hm,tr[rch(k)].hm);tr[k].hs=min(tr[lch(k)].hs,tr[rch(k)].hs); tr[k].g=min(tr[lch(k)].g,tr[rch(k)].g);tr[k].sum=min(tr[lch(k)].sum,tr[rch(k)].sum);
}void pushdown(int k){if(lazy[k]){lazy[lch(k)]=lazy[rch(k)]=lazy[k];tr[lch(k)].hm=tr[lch(k)].hs=tr[rch(k)].hm=tr[rch(k)].hs=lazy[k];tr[lch(k)].sum=tr[lch(k)].g+lazy[k];tr[rch(k)].sum=tr[rch(k)].g+lazy[k];lazy[k]=0;}
}void build(int k,int l,int r){tr[k].l=l,tr[k].r=r;if(l==r)return ;int mid=l+r>>1;build(lch(k),l,mid),build(rch(k),mid+1,r);
}void ChangeHeight(int k,int x,int y,int num){if(num<=tr[k].hs)return;// 比最小的还小,不会对答案产生影响,返回 int l=tr[k].l,r=tr[k].r;if(l>=x&&r<=y){if(tr[k].hm<=num){ // 如果大于最大值,那么该区间内所有的sum值都需要更新一次 lazy[k]=tr[k].hm=tr[k].hs=num;tr[k].sum=tr[k].g+num;return ;}}pushdown(k);int mid=l+r>>1;if(x<=mid)ChangeHeight(lch(k),x,y,num);if(y>mid)ChangeHeight(rch(k),x,y,num);pushup(k);
}ll Query(int k,int x,int y){int l=tr[k].l,r=tr[k].r;if(l>=x&&r<=y)return tr[k].sum;// 正常的查询 pushdown(k);int mid=l+r>>1;ll res=1e18;if(x<=mid)res=min(res,Query(lch(k),x,y));if(y>mid)res=min(res,Query(rch(k),x,y));pushup(k);return res;
}void ChangeDp(int k,int x,int num){int l=tr[k].l,r=tr[k].r;if(l==x&&r==x){tr[k].g=num;return;// 单点修改DP基底值 }pushdown(k);int mid=l+r>>1;if(x<=mid)ChangeDp(lch(k),x,num);else ChangeDp(rch(k),x,num);tr[k].g=min(tr[lch(k)].g,tr[rch(k)].g);
}int n,l;
int main(){scanf("%d%d",&n,&l);for(int i=1;i<=n;i++){scanf("%lld%lld",&h[i],&L[i]);}build(1,0,n);ll Sum=0,temp=1,ans=0;for(int i=1;i<=n;i++){Sum+=L[i];while(Sum>l)temp++,Sum-=L[temp-1];ChangeHeight(1,temp-1,i-1,h[i]);// 该新书的可放置范围为temp-1->i-1 ans=Query(1,temp-1,i-1);        // 查询最优值 if(i!=n)ChangeDp(1,i,ans);      // 改变前面的DP基值,做到累计答案 }cout<<ans;
}

P1848「Usaco2012 Open」书架相关推荐

  1. 将AI落地到福州、贵阳的「幕后推手」,到底在想些什么?

    2020-07-10 15:48:51 乾明 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 从抗击新冠肺炎的冲锋陷阵,到日常生活中的效率提升- 依图科技,正在用一次次行动,一座座城市,展 ...

  2. 模型存储在哪里_最强的模型工作收纳站「Artty Station」登场!

    大部分做模型的人,都有同一个梦想--那就是「属于自己的模型空间」. 但很少有人,有足够的空间去收纳自己的模型工具.而现在,一款号称史上最强的模型收纳站「Artty Station」横空出世了,现在正在 ...

  3. 哈佛大学砸场子:DALL-E 2只是「粘合怪」,生成正确率只有22%

      视学算法报道   编辑:LRS [导读]DALL-E 2生成的图像确实令人惊叹,但它也有弊端,哈佛大学最新研究表明,文本提示内的关系它根本都不懂,生成图像的正确率仅有22%! DALL-E 2刚发 ...

  4. 建成 5000 多间「梦想中心」后,他们决定将技术开源

    | 转载自:腾源会 | 编辑:李佳阳 | 责编:王玥敏 | 设计:宋传琪 「有书读是一件很幸福的事」. 20 年前,在甘肃.云南.川北--这片土地上,一群孩子坐在破破烂烂,风吹即倒的「教室」里大声朗诵 ...

  5. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  6. windows系统和linux系统可以使用相同的js代码吗_「React 手册 」在 Windows 下使用 React , 你需要注意这些问题...

    大家好,本篇内容,我要和大家聊聊使用 Windows 开发 React ,你需要注意的一些问题.首先说明下,我不是使用 windows 进行开发,因为其配置开发环境来说不是特别方便,我更喜欢 苹果ma ...

  7. 自己动手,做一款抬头显示的「Todo Hud」

    我用过好多款 TodoList 软件,但事情一多总还是丢三落四,原本计划好要做的事情总是安静地躺在某个角落,等我想起来要去扫一眼的时候,都已快「物是人非」... 要是能在桌面上实时显示 TodoLis ...

  8. 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?

    背景 前几天,我们介绍了 如何利用C# + Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了. 可是,把软件原型提交给对方时,发现对方更希望& ...

  9. 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...

最新文章

  1. 在Ubuntu17.04中遇到无法清空回收站解决方法
  2. 教你创建高大上的多边形字体
  3. C 函数传递指针参数注意事项
  4. Java IdentityHashMap putAll()方法与示例
  5. OpenStack绝非昨日黄花 | 人物志
  6. 机床使用教学_辽宁高校学子前往凤城市,进行与数控机床相关的专业实践活动...
  7. Ubuntu下安装支付宝安全控件
  8. 魔术方法 :__callStatic( )实例详解
  9. 深圳有哪些牛逼的互联网公司?看完你再跳槽!
  10. 中南大学复试上机:1021:机器人走迷宫
  11. 今日头条改版,搜索比重上升,占首屏三分之一
  12. C++boost库中sp_counted_impl_x实现解析
  13. ESP32数据存储 nvs
  14. 使用POI实现Excel导出导入 详细解释
  15. C#最小二乘法进行曲线拟合及相关系数
  16. vim配置及常用插件安装
  17. Word2016查找和替换通配符(完全版)
  18. 暗黑破坏神(diablo)
  19. 【跟Leon一起刷LeetCode】344. Reverse String
  20. 试试这2个流动图片制作方法让你的图片动起来吧

热门文章

  1. A ConvNet for the 2020s的总结
  2. Mybatis面试题集锦 那些经常问到的Mybatis面试30题
  3. 边缘计算技术发展现状与对策
  4. 使用Faststone Capture工具搭建CSS时的直尺测量像素值不准的原因及解决方案
  5. 回头看看我的2019
  6. OpenCV灰度直方图
  7. 人工蜂群算法(Artificial Bee Colony Algorithm,ABC)
  8. DGN格式转化为shp格式 【转】
  9. 如何在Android上恢复已删除的短信
  10. 羽毛球双打处于进攻态势时应如何处理