Codeforces1131G Most Dangerous Shark
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;
}
Codeforces1131G Most Dangerous Shark的更多相关文章
- CodeForces 1131G. Most Dangerous Shark
题目简述:从左到右依次有$n \leq 10^7$个Domino骨牌,高度为$h_i$,手动推倒他的花费为$c_i$.每个骨牌之间的距离为$1$.一个骨牌可以被向左或者向右推倒.当第$i$个骨牌被推倒 ...
- Codeforces Round #541 (Div. 2) (A~F)
目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...
- Codeforces-541div2
https://www.cnblogs.com/31415926535x/p/10427505.html codeforces-1131A~G 这场很多题都很简单,,应该是要能至少做出4道的,,但是我 ...
- Codeforces Round #541
因为这次难得不在十点半(或是更晚),大家都在打,然后我又双叒叕垫底了=.= 自己对时间的分配,做题的方法和心态还是太蒻了,写的时候经常写一半推倒重来.还有也许不是自己写不出来,而是在开始写之前就觉得自 ...
- Codeforces 1131 (div 2)
链接:http://codeforces.com/contest/1131 A Sea Battle 利用良心出题人给出的图,不难看出答案为\(2*(h1+h2)+2*max(w1,w2)+4\)由于 ...
- 与"shark"相关的表达
The word shark can be used to describe someone who is tricky and uses other people. Shark这个单词可以用来形容一 ...
- System.Web.HttpRequestValidationException: A potentially dangerous Request.F
ASP.NET .0验证请求 System.Web.HttpRequestValidationException: A potentially dangerous Request.F System.W ...
- 机器学习库shark安装
经过两天的折腾,一个对c++和机器学习库的安装都一知半解的人终于在反复安装中,成功的将shark库安装好了,小小纪念一下,多亏了卡门的热心帮忙. shark的安装主要分为以下几个部分: (1)下载 s ...
- ASP.NET 4.0 potentially dangerous Request.Form value was detected
A few days ago, while working on an ASP.NET 4.0 Web project, I got an issue. The issue was, when use ...
随机推荐
- Petya and Graph/最大权闭合子图、最小割
原题地址:https://codeforces.com/contest/1082/problem/G G. Petya and Graph time limit per test 2 seconds ...
- day33:进程II
目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 锁:Lock 1.锁的基本概念 上锁和解 ...
- node.js 模拟自动发送邮件验证码
node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...
- eclipse git如何切换分支,拉取代码,合并代码,解决冲突等
(如果想看eclipse拉取git项目,移步到我上一篇文章)以下步骤是eclipse运用git的切换分支,拉取合并代码的基本操作: 1.切换远程分支:鼠标右键项目--team--switch to - ...
- Linux环境下如何生成core文件
Linux环境下进程发生异常而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息.但是生成core文件需要设置开关,具体步骤如下: 1.查看生成core文件 ...
- python编程中的并发------多进程multiprocessing
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...
- Java数据结构——2-3树
定义2-3树是平衡的3路查找树,其中2(2-node)是指拥有两个分支的节点,3(3-node)是指拥有三个分支的节点.B-树是一种平衡的多路查找树,2-3树属于b-树,其也同样具有B-树的性质,如m ...
- Java多线程_同步工具CyclicBarrier
CyclicBarrier概念:CyclicBarrier是多线程中的一个同步工具,它允许一组线程互相等待,直到到达某个公共屏障点.形象点儿说,CyclicBarrier就是一个屏障,要求这一组线程中 ...
- [PKUWC2018]Minimax 题解
根据题意,若一个点有子节点,则给出权值:否则可以从子节点转移得来. 若没有子节点,则直接给出权值: 若只有一个子节点,则概率情况与该子节点完全相同: 若有两个子节点,则需要从两个子节点中进行转移. 如 ...
- Cobalt strike与内网渗透
cobalt strike的用法参照我之前的博客: https://www.cnblogs.com/vege/p/12743274.html 这里只演示上线之后的操作. Socks代理 开启socks ...