斜率优化dp板子题[迫真]

这里从下往上标记\(1-n\)号点

记\(a_i\)表示前缀\(i\)里面树木的总重量,\(l_i\)表示\(i\)到最下面的距离,\(s_i\)表示\(1\)到\(i-1\)号树运到最下面的代价(就是下面那个伐木厂产生的代价),\(f_i\)表示上面那个伐木厂在\(i\),\(1\)到\(i-1\)号树产生的代价

我们可以用脚列出式子$$f_i=min(s_j+(s_i-s_{j+1})-l_j(a_{i-1}-a_j))$$

就是下面那个伐木厂产生的代价\(s_j\)+两个伐木厂之间的树(\(j+1\)到\(i-1\))产生的代价,记为\(g\)(\(s_i=s_{j+1}+g+l_j(a_{i-1}-a_j)\))

然后把式子展开$$f_i=min(s_j+s_i-s_{j+1}-l_ja_{i-1}+l_ja_j)$$

设\(A_i=s_i-s_{i+1}+l_ia_i\)

原式变为$$f_i=min(A_j+s_i-l_ja_{i-1})$$

假定决策\(j\)优于决策\(k\),有$$A_j+s_i-l_ja_{i-1}< A_k+s_i-l_ka_{i-1}$$

可以化简为$$a_{i-1}<\frac{A_k-A_j}{l_k-l_j}$$

开单调队列维护一个下凸壳,每次先把队首的斜率小于\(a_{i-1}\)的弹掉,然后用队首转移,把\(i\)插入队尾,把斜率过高的弹掉

还不会就参考P3195救星了

不是我懒得写,是因为我怕再写就扯不清楚了,还有前面的分析很详细了不是吗qwq

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double using namespace std;
const int N=20000+10;
il LL rd()
{
re LL x=0,w=1;re char ch;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n;
LL a[N],s[N],l[N],f[N],ans=2333333333;
//M_sea&Qihoo360
il db A(int i){return s[i]-s[i+1]+a[i]*l[i];}
il db K(int j,int k){return (db)(A(k)-A(j))/(db)(l[k]-l[j]);}
//IOI int main()
{
n=rd();
for(int i=n;i>=1;i--) a[i]=rd(),l[i]=rd();
for(int i=1;i<=n;i++) l[i]+=l[i-1],s[i]=s[i-1]+a[i]*l[i],a[i]+=a[i-1];
for(int i=n+1;i>=2;i--) s[i]=s[i-1];s[1]=0;
int q[N],hd=1,tl=1;
q[1]=0;
for(int i=1;i<=n;i++)
{
while(hd<tl&&K(q[hd],q[hd+1])<=(db)(a[i-1])) ++hd;
f[i]=s[q[hd]]+(s[i]-s[q[hd]+1])-(a[i-1]-a[q[hd]])*l[q[hd]];
ans=min(ans,f[i]+(s[n+1]-s[i+1])-(a[n]-a[i])*l[i]); //对于每个f[i]更新答案
while(hd<tl&&K(q[tl],q[tl-1])>=K(i,q[tl-1])) --tl;
q[++tl]=i;
}
printf("%lld\n",ans);
return 0;
}

luogu P4360 [CEOI2004]锯木厂选址的更多相关文章

  1. P4360 [CEOI2004]锯木厂选址

    P4360 [CEOI2004]锯木厂选址 这™连dp都不是 \(f_i\)表示第二个锯木厂设在\(i\)的最小代价 枚举1号锯木厂 \(f_i=min_{0<=j<i}(\sum_{i= ...

  2. 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)

    传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...

  3. 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)

    传送门 我可能根本就没有学过斜率优化…… 我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯 ...

  4. 洛谷P4360 [CEOI2004]锯木厂选址(dp 斜率优化)

    题意 题目链接 Sol 枚举第二个球放的位置,用前缀和推一波之后发现可以斜率优化 // luogu-judger-enable-o2 #include<bits/stdc++.h> #de ...

  5. luoguP4360 [CEOI2004]锯木厂选址

    题目链接 luoguP4360 [CEOI2004]锯木厂选址 题解 dis:后缀和 sum:前缀和 补集转化,减去少走的,得到转移方程 dp[i] = min(tot - sumj * disj - ...

  6. 动态规划(斜率优化):[CEOI2004]锯木厂选址

    锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...

  7. [BZOJ2684][CEOI2004]锯木厂选址

    BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...

  8. cogs 362. [CEOI2004]锯木厂选址

    ★★★   输入文件:two.in   输出文件:two.out   简单对比 时间限制:0.1 s   内存限制:32 MB 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来. ...

  9. LG4360 [CEOI2004]锯木厂选址

    题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...

随机推荐

  1. CSS兼容性详解

    前面的话 对于前端工程师来说,不想面对又不得不面对的一个问题就是兼容性.在几年之前,处理兼容性,一般地就是处理IE低版本浏览器的兼容性.而近几年,随着移动端的发展,工程师也需要注意手机兼容性了.本文将 ...

  2. linq 分组取各组最大值

    static List<User> list1 = new List<User>() { new User(){id=1,name="张三"}, new U ...

  3. MT【228】整数解的个数

    求方程$x+y+z=24$的整数解的个数,要求$1\le x\le 5,12\le y\le 18,-1\le z\le12$ 解:设$a_r$是方程$X+Y+Z=r$的满足上述要求的整数解的个数,那 ...

  4. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  5. 自学Zabbix6.1 Event acknowledgment 事件确认

    自学Zabbix6.1 Event acknowledgment 事件确认 1 概述以往服务器出现报警,运维人员处理完事之后,报警自动取消,但是下一次出现同样一个错误,但是换了一个运维人员,他可能需要 ...

  6. CF528D Fuzzy Search 【NTT】

    题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...

  7. 洛谷 P2491消防 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  8. Ubuntu安装Atom编辑器

    安装方法 执行以下命令 sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update udo apt-get install ato ...

  9. [HNOI/AHOI2018]转盘

    一个结论:一定存在一个最优解只走一圈.否则考虑从最后一个结束位置开始一定可以达到相同效果 画个图,类似是一种斜线感觉 考虑一个高度贡献的最高点 对于i开始的连续n个,答案是:max(Tj-j)+i+n ...

  10. NOIP2018普及组模拟赛

    向老师给的模拟赛,还没普及组难... 题目在洛谷团队里. 第一试三道水题,我46分钟就打完了,然后就AK了. 第二试一看,除了第二题要思考一段时间之外,还是比较水的,但是我得了Rank倒1,115分. ...