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

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define M 10000001
  4. #define N 250010
  5. #define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
  6. using namespace std;
  7. 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];
  8. long long f[M],g[M],c[M];
  9. int main()
  10. {
  11. open("shark");
  12. scanf("%d%d",&n,&m);
  13. for (i=1;i<=n;i++)
  14. {
  15. scanf("%d",&k[i]);
  16. pl[i]=cnt+1;
  17. for (j=1;j<=k[i];j++)
  18. scanf("%d",&a[++cnt]);
  19. cnt=pl[i]-1;
  20. for (j=1;j<=k[i];j++)
  21. scanf("%d",&b[++cnt]);
  22. }
  23. pl[n+1]=cnt+1;
  24. scanf("%d",&q);
  25. for (i=1;i<=q;i++)
  26. {
  27. scanf("%d %d",&id,&mul);
  28. for (j=pl[id];j<=pl[id+1]-1;j++)
  29. {
  30. h[++t]=a[j];
  31. c[t]=(long long)b[j]*mul;
  32. }
  33. }zhan[1]=zhan[0]=1;
  34. for (i=1;i<=m;i++)
  35. {
  36. left[i]=max(1,i-h[i]+1);
  37. t=left[i];
  38. while (left[i]<=zhan[zhan[0]])
  39. {
  40. if (!zhan[0]) break;
  41. t=min(t,left[zhan[zhan[0]]]);
  42. zhan[0]--;
  43. }
  44. left[i]=t;
  45. zhan[++zhan[0]]=i;
  46. }
  47. zhan[1]=m;zhan[0]=1;
  48. for (i=m;i>=1;i--)
  49. {
  50. right[i]=min(m,i+h[i]-1);
  51. t=right[i];
  52. while (right[i]>=zhan[zhan[0]])
  53. {
  54. if (!zhan[0]) break;
  55. t=max(t,right[zhan[zhan[0]]]);
  56. zhan[0]--;
  57. }
  58. right[i]=t;
  59. zhan[++zhan[0]]=i;
  60. }
  61. f[1]=g[1]=c[1];
  62. zhan[0]=zhan[1]=1;
  63. for (i=2;i<=m;i++)
  64. {
  65. f[i]=min(f[left[i]-1],g[left[i]-1])+c[i];
  66. while (right[zhan[zhan[0]]]<i && zhan[0]) zhan[0]--;
  67. g[i]=min(g[i-1],f[i-1])+c[i];
  68. if (!zhan[0]) zhan[++zhan[0]]=i;else
  69. {
  70. g[i]=min(g[i],g[zhan[zhan[0]]]);
  71. if (g[i]<g[zhan[zhan[0]]]) zhan[++zhan[0]]=i;
  72. }
  73. }
  74. printf("%lld",min(g[m],f[m]));
  75. return 0;
  76. }

Codeforces1131G Most Dangerous Shark的更多相关文章

  1. CodeForces 1131G. Most Dangerous Shark

    题目简述:从左到右依次有$n \leq 10^7$个Domino骨牌,高度为$h_i$,手动推倒他的花费为$c_i$.每个骨牌之间的距离为$1$.一个骨牌可以被向左或者向右推倒.当第$i$个骨牌被推倒 ...

  2. Codeforces Round #541 (Div. 2) (A~F)

    目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...

  3. Codeforces-541div2

    https://www.cnblogs.com/31415926535x/p/10427505.html codeforces-1131A~G 这场很多题都很简单,,应该是要能至少做出4道的,,但是我 ...

  4. Codeforces Round #541

    因为这次难得不在十点半(或是更晚),大家都在打,然后我又双叒叕垫底了=.= 自己对时间的分配,做题的方法和心态还是太蒻了,写的时候经常写一半推倒重来.还有也许不是自己写不出来,而是在开始写之前就觉得自 ...

  5. Codeforces 1131 (div 2)

    链接:http://codeforces.com/contest/1131 A Sea Battle 利用良心出题人给出的图,不难看出答案为\(2*(h1+h2)+2*max(w1,w2)+4\)由于 ...

  6. 与"shark"相关的表达

    The word shark can be used to describe someone who is tricky and uses other people. Shark这个单词可以用来形容一 ...

  7. System.Web.HttpRequestValidationException: A potentially dangerous Request.F

    ASP.NET .0验证请求 System.Web.HttpRequestValidationException: A potentially dangerous Request.F System.W ...

  8. 机器学习库shark安装

    经过两天的折腾,一个对c++和机器学习库的安装都一知半解的人终于在反复安装中,成功的将shark库安装好了,小小纪念一下,多亏了卡门的热心帮忙. shark的安装主要分为以下几个部分: (1)下载 s ...

  9. 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 ...

随机推荐

  1. Petya and Graph/最大权闭合子图、最小割

    原题地址:https://codeforces.com/contest/1082/problem/G G. Petya and Graph time limit per test 2 seconds ...

  2. day33:进程II

    目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 锁:Lock 1.锁的基本概念 上锁和解 ...

  3. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...

  4. eclipse git如何切换分支,拉取代码,合并代码,解决冲突等

    (如果想看eclipse拉取git项目,移步到我上一篇文章)以下步骤是eclipse运用git的切换分支,拉取合并代码的基本操作: 1.切换远程分支:鼠标右键项目--team--switch to - ...

  5. Linux环境下如何生成core文件

    Linux环境下进程发生异常而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息.但是生成core文件需要设置开关,具体步骤如下: 1.查看生成core文件 ...

  6. python编程中的并发------多进程multiprocessing

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  7. Java数据结构——2-3树

    定义2-3树是平衡的3路查找树,其中2(2-node)是指拥有两个分支的节点,3(3-node)是指拥有三个分支的节点.B-树是一种平衡的多路查找树,2-3树属于b-树,其也同样具有B-树的性质,如m ...

  8. Java多线程_同步工具CyclicBarrier

    CyclicBarrier概念:CyclicBarrier是多线程中的一个同步工具,它允许一组线程互相等待,直到到达某个公共屏障点.形象点儿说,CyclicBarrier就是一个屏障,要求这一组线程中 ...

  9. [PKUWC2018]Minimax 题解

    根据题意,若一个点有子节点,则给出权值:否则可以从子节点转移得来. 若没有子节点,则直接给出权值: 若只有一个子节点,则概率情况与该子节点完全相同: 若有两个子节点,则需要从两个子节点中进行转移. 如 ...

  10. Cobalt strike与内网渗透

    cobalt strike的用法参照我之前的博客: https://www.cnblogs.com/vege/p/12743274.html 这里只演示上线之后的操作. Socks代理 开启socks ...