Codeforces1131G Most Dangerous Shark
2024-10-09 16:33:55
Description
Original Problem
Chinese Translation
大概就是给你一个间隔为1的多米诺序列,推倒一个多米诺骨牌有个花费,求推倒所有多米诺骨牌的最小花费
Solution
这道题先处理出每一个点最左及最右可推倒的位置,这可以用栈维护
设以上位置为\(l_{i}\),\(r_{i}\)
接下来设\(f_{i}\)为第1~i个点全部倒下,且第i个点往左倒的最小花费
\(g_{i}\)为第1~i个点全部倒下,且第i个点往右倒的最小花费
先考虑\(f_{i}\)
显然,\(f_{i}=min(f_{l_{i}-1},g_{l_{i}-1})+cost_{i}\)
即第\(l_{i}-1\)之前的点都倒下再加上\(l_{i}\)到i倒下的花费
再考虑\(g_{i}\)
对于\(g_{i}\),初始肯定是手动放倒该点即$$g_{i}=min(g_{i-1},f_{i-1})+cost_{i}$$
用一个栈维护最小的能推倒i的\(g_{j}\)来更新\(g_{i}\)
因为j能影响i,那么i能影响的j都能影响,所以只有\(g_{i}<g_{j}\)时才需要将该点压入栈中
Code
#include <cstdio>
#include <algorithm>
#define M 10000001
#define N 250010
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int n,m,i,q,id,mul,t,j,cnt,zhan[M],left[M],right[M],k[N],a[N],b[N],h[M],pl[N];
long long f[M],g[M],c[M];
int main()
{
open("shark");
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&k[i]);
pl[i]=cnt+1;
for (j=1;j<=k[i];j++)
scanf("%d",&a[++cnt]);
cnt=pl[i]-1;
for (j=1;j<=k[i];j++)
scanf("%d",&b[++cnt]);
}
pl[n+1]=cnt+1;
scanf("%d",&q);
for (i=1;i<=q;i++)
{
scanf("%d %d",&id,&mul);
for (j=pl[id];j<=pl[id+1]-1;j++)
{
h[++t]=a[j];
c[t]=(long long)b[j]*mul;
}
}zhan[1]=zhan[0]=1;
for (i=1;i<=m;i++)
{
left[i]=max(1,i-h[i]+1);
t=left[i];
while (left[i]<=zhan[zhan[0]])
{
if (!zhan[0]) break;
t=min(t,left[zhan[zhan[0]]]);
zhan[0]--;
}
left[i]=t;
zhan[++zhan[0]]=i;
}
zhan[1]=m;zhan[0]=1;
for (i=m;i>=1;i--)
{
right[i]=min(m,i+h[i]-1);
t=right[i];
while (right[i]>=zhan[zhan[0]])
{
if (!zhan[0]) break;
t=max(t,right[zhan[zhan[0]]]);
zhan[0]--;
}
right[i]=t;
zhan[++zhan[0]]=i;
}
f[1]=g[1]=c[1];
zhan[0]=zhan[1]=1;
for (i=2;i<=m;i++)
{
f[i]=min(f[left[i]-1],g[left[i]-1])+c[i];
while (right[zhan[zhan[0]]]<i && zhan[0]) zhan[0]--;
g[i]=min(g[i-1],f[i-1])+c[i];
if (!zhan[0]) zhan[++zhan[0]]=i;else
{
g[i]=min(g[i],g[zhan[zhan[0]]]);
if (g[i]<g[zhan[zhan[0]]]) zhan[++zhan[0]]=i;
}
}
printf("%lld",min(g[m],f[m]));
return 0;
}
最新文章
- 学习设计模式第二十七 - GoF之外简单工厂模式
- copy(python中的引用,浅拷贝,深拷贝)
- Openvswitch原理与代码分析(1):总体架构
- rsync同步Nginx日志遇到问题总结
- Linux /dev 自动创建设备节点
- Codeforces Round #326 div2
- 定时显示div
- [转帖]自动调整TextView字体大小以适应文字长度
- COJ 0885 LCS???
- html标签引入外部html
- puts fputs printf的区别
- 服务端套接字类CxServerSocket的使用
- java 中使用RSA非对称性加密解密
- Linux内存、性能诊断中vmstat命令的详解
- 看雪CTF第十四题
- javascript闭包—围观大神如何解释闭包
- tips___代码规范
- 虚拟机三种网络模式详解(Bridge,Nat,Host-only)
- OpenGL基本框架与三维对象绘制
- python学习读取配置文件
热门文章
- 一键打开 jupyter
- SpringBoot --- 自定义 Starter
- docker入门3-docker swarm
- 已废弃_CSDN慕零的黑夜-头条-第一期(必问)[导读:]1.CSDN必问赏金流向何方 2.CSDN必问偷偷做的手脚 3.CSDN必问靠谱吗 4.关于钱于回答的平衡问题:一美元拍卖骗局qq3461896724
- Java面试通关要点汇总整理
- Nginx进阶使用-负载均衡原理及配置实例
- 【Go】单链表
- MPI自定义数据类型
- 超级码力编程赛带着6万奖金和1200件T恤向你跑来了~
- 抗疫复产,CDN助企业破局发展