题目大意

  有\(n\)个格子,一开始你在\(1\)号格子。每次你只能往编号更大的格子走。从第\(i\)个格子走到第\(j\)个格子的代价是\(a_i+a_j\times(j-i)\times m\)

  \(a_i\)为与\(i\)互质且不大于\(i\)的正整数的个数。

  \(n\leq 1000000\)

题解

  显然\(a_i=\varphi(i)\)。

  如果\(j<k\)且\(j\)比\(k\)优,那么

\[\begin{align}
f_j+a_j+a_i\times (i-j)\times m&<f_k+a_k+a_i\times (i-k)\times m\\
f_j+a_j+a_iim-a_ijm&<f_k+a_k+a_iim-a_ikm\\
f_j+a_j-a_ijm&<f_k+a_k-a_ikm\\
f_j+a_j-f_k-a_k&<a_ijm-a_ikm\\
\frac{f_j-f_k+a_j-a_k}{j-k}&>a_im
\end{align}
\]

  这告诉我们要维护一个斜率递增的栈。

  这道题\(a_i\)不像其他题一样是单调递增的,所以要把下凸壳上所有的点保存下来,每次二分找到最优的点。

  时间复杂度:\(O(n\log n)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<utility>
  7. #include<cmath>
  8. #include<functional>
  9. using namespace std;
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12. typedef pair<int,int> pii;
  13. typedef pair<ll,ll> pll;
  14. void sort(int &a,int &b)
  15. {
  16. if(a>b)
  17. swap(a,b);
  18. }
  19. void open(const char *s)
  20. {
  21. #ifndef ONLINE_JUDGE
  22. char str[100];
  23. sprintf(str,"%s.in",s);
  24. freopen(str,"r",stdin);
  25. sprintf(str,"%s.out",s);
  26. freopen(str,"w",stdout);
  27. #endif
  28. }
  29. int rd()
  30. {
  31. int s=0,c;
  32. while((c=getchar())<'0'||c>'9');
  33. do
  34. {
  35. s=s*10+c-'0';
  36. }
  37. while((c=getchar())>='0'&&c<='9');
  38. return s;
  39. }
  40. int upmin(int &a,int b)
  41. {
  42. if(b<a)
  43. {
  44. a=b;
  45. return 1;
  46. }
  47. return 0;
  48. }
  49. int upmax(int &a,int b)
  50. {
  51. if(b>a)
  52. {
  53. a=b;
  54. return 1;
  55. }
  56. return 0;
  57. }
  58. int b[1000010];
  59. int pri[1000010];
  60. int cnt;
  61. int phi[1000010];
  62. ll f[1000010];
  63. //ll g[1000010];
  64. int q[1000010];
  65. //int from[1000010];
  66. ll gety(int x)
  67. {
  68. return f[x]+phi[x];
  69. }
  70. int n,m;
  71. ll calc(int x,int y)
  72. {
  73. return f[x]+phi[x]+phi[y]*ll(y-x)*m;
  74. }
  75. int main()
  76. {
  77. open("pfzr");
  78. scanf("%d%d",&n,&m);
  79. int i,j;
  80. phi[1]=1;
  81. for(i=2;i<=n;i++)
  82. {
  83. if(!b[i])
  84. {
  85. pri[++cnt]=i;
  86. phi[i]=i-1;
  87. }
  88. for(j=1;j<=cnt&&i*pri[j]<=n;j++)
  89. {
  90. b[i*pri[j]]=1;
  91. if(i%pri[j]==0)
  92. {
  93. phi[i*pri[j]]=phi[i]*pri[j];
  94. break;
  95. }
  96. phi[i*pri[j]]=phi[i]*phi[pri[j]];
  97. }
  98. }
  99. memset(f,0x7f,sizeof f);
  100. // memset(g,0x7f,sizeof g);
  101. // g[1]=0;
  102. f[1]=0;
  103. // for(i=2;i<=n;i++)
  104. // for(j=1;j<i;j++)
  105. // if(g[j]+phi[j]+ll(phi[i])*(i-j)*m<g[i])
  106. // {
  107. // g[i]=g[j]+phi[j]+ll(phi[i])*(i-j)*m;
  108. // from[i]=j;
  109. // }
  110. int t=0;
  111. q[++t]=1;
  112. for(i=2;i<=n;i++)
  113. {
  114. int l=1,r=t;
  115. while(l<r)
  116. {
  117. int mid=(l+r)>>1;
  118. if(gety(q[mid])-gety(q[mid+1])<ll(q[mid]-q[mid+1])*phi[i]*m)
  119. r=mid;
  120. else
  121. l=mid+1;
  122. }
  123. f[i]=f[q[l]]+phi[q[l]]+ll(phi[i])*(i-q[l])*m;
  124. while(t>=2&&(gety(q[t-1])-gety(q[t]))*(q[t]-i)>(gety(q[t])-gety(i))*(q[t-1]-q[t]))
  125. t--;
  126. while(t>=1&&gety(q[t])-gety(i)>0)
  127. t--;
  128. q[++t]=i;
  129. }
  130. printf("%lld\n",f[n]);
  131. return 0;
  132. }

【XSY1476】平凡之路 斜率优化DP的更多相关文章

  1. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  2. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

  3. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  4. CodeForces 311 B Cats Transport 斜率优化DP

    题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...

  5. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  6. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  7. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  8. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  9. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

随机推荐

  1. 全文搜索引擎 Elasticsearch 入门教程

    全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...

  2. Mysql多实例之mysql服务脚本

    1. #init port=3306 mysql_user="root" mysql_pwd="cancer" CmdPath="/applicati ...

  3. Node.js api接口和SQL数据库关联

    数据库表创建 服务器环境配置.连接 .操作.数据库 API接口  原则:

  4. Linux reboot与init 6区别

    Reboot与init 6的区别 - flyingcloud_2008的专栏 - CSDN博客https://blog.csdn.net/flyingcloud_2008/article/detail ...

  5. Alibaba Cloud Toolkit for Eclipse & ECS、EDAS 或容器服务 Kubernetes

    UserGuide_V2.1.0http://toolkit.aliyun.com/eclipse/?spm=5176.2020520130.105.3.3c3b697bOHma9f&msct ...

  6. Freemarker 页面静态化技术使用入门案例

    在访问 新闻.活动.商品 详情页面时, 路径可以是 xx[id].html, 服务器端根据请求 id, 动态生成 html 网页,下次访问数据时,无需再查询数据,直接将 html 静态页面返回.这样一 ...

  7. Laravel5.5+ 区分前后端用户登录

    Laravel 的用户认证是通过 Auth Facade 门脸实现的,手动认证可是使用  Auth::login() 或 Auth::attempt() 这两个方法实现. 以下内容纯属个人实现,也许有 ...

  8. day 7-2 multiprocessing开启多进程

    一. multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多 ...

  9. 设置SQLServer数据库内存

    需要设置SQLServer数据库的内存配置.登录数据库,这里使用的是SQLServer2008,右键点击最上方的服务器名,在弹出的菜单中,点击属性] 打开服务器属性窗口.默认显示的是第一项[常规]内容 ...

  10. 工作效率提升之Eclipse篇(1):干掉烦人的xml文件的validation

    每次启动maven项目,都会有一堆烦人的xml文件的validation,一旦网络较慢,项目重新启动的时候,这些多余的验证纯属浪费时间. Eclipse上取消validation的方法: 1.菜单[W ...