题意

有一只青蛙,有\(0, 1, \cdots, N - 1\)个荷叶。每个荷叶上有权值\(s_i\)。

  1. 选定\(A\), \(B\),初始分数为\(0\)。

    当前位置为\(x\):
  2. 对于\(y = x + A\):
    • 如果\(y = N - 1\),游戏结束。
    • 如果\(y \neq N - 1\),但是\(y\)这个荷叶存在,那么分数增加\(s_i\),并且这片荷叶消失。
    • 如果\(y \neq N - 1\),但是\(y\)这个荷叶不存在,那么分数减去\(10^{100}\),游戏结束。
  3. 对于\(y = x - B\):
    • 如果\(y = N - 1\),游戏结束。
    • 如果\(y \neq N - 1\),但是\(y\)这个荷叶存在,那么分数增加\(s_i\),并且这片荷叶消失。
    • 如果\(y \neq N - 1\),但是\(y\)这个荷叶不存在,那么分数减去\(10^{100}\),游戏结束。

      问选定最优的\(A\)、\(B\)的情况下,得到的最高分数为多少?

思路

我们考虑,选定了\(A\)、\(B\)后,青蛙的行走路线为:

\[\begin{eqnarray*}
0, A, A - B, A + (A - B), 2(A - B), \cdots, K(A - B), A + K(A - B)
\end{eqnarray*}
\]

我们令\(C = A - B\):

\[\begin{eqnarray*}
0, A, C, A + C, 2C, \cdots, KC, A + KC
\end{eqnarray*}
\]

显然有:\(A + KC = N - 1\):

\[\begin{eqnarray*}
0, N - 1 - KC, C, N - 1 - (K - 1)C, 2C, \cdots, KC, N - 1
\end{eqnarray*}
\]

那么当\(K\)、\(C\)确定的时候,行走路线就已经确定。

并且有一个限制条件为\(KC < N\),那么显然枚举\(K\)、\(C\)是\(O(nlogn)\)的。

并且我们发现,当我们固定\(C\),递增\(K\)的时候,行走路线的变化是这样的:

\[\begin{eqnarray*}
&&0, N - 1\\
&&0, N - 1 - C, C, N - 1\\
&&0, N - 1 - 2C, C, n - 1 - C, 2C, N - 1\\
\end{eqnarray*}
\]

每次增加的是\(N - 1 - KC\)和\(KC\),这两个点,只需要加上就好了,并且要注意判断是否走到重复的点上了。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 100010
  5. int n;
  6. ll s[N];
  7. int used[N];
  8. int main() {
  9. while (scanf("%d", &n) != EOF) {
  10. for (int i = 0; i < n; ++i) {
  11. scanf("%lld", s + i);
  12. }
  13. memset(used, 0, sizeof used);
  14. ll res = 0;
  15. for (int C = 1; C <= n; ++C) {
  16. ll tmp = 0;
  17. for (int k = 1; 1ll * k * C < n; ++k) {
  18. int a = k * C;
  19. int b = n - 1 - k * C;
  20. int A = b, B = b - C;
  21. if (A <= 0 || B <= 0) break;
  22. if (a < 0 || a >= n || b < 0 || b >= n || a == b) break;
  23. if (used[a] == C || used[b] == C) {
  24. break;
  25. }
  26. used[a] = C;
  27. used[b] = C;
  28. tmp += s[a];
  29. tmp += s[b];
  30. res = max(res, tmp);
  31. }
  32. }
  33. printf("%lld\n", res);
  34. }
  35. return 0;
  36. }

AtCoder Beginner Contest 128 F - Frog Jump的更多相关文章

  1. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  2. AtCoder Beginner Contest 261 F // 树状数组

    题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...

  3. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  4. AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组

    题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...

  5. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  6. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  7. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

  8. AtCoder Beginner Contest 171-175 F

    171 F - Strivore 直接把初始字符当成隔板,统计的方案数会有重复 为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串 所以在隔板字母后插入的字符只有 ...

  9. AtCoder Beginner Contest 182 F

    F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...

随机推荐

  1. SAS学习笔记26 方差分析

    对于多于两组(k>2)样本均数的比较,t检验不再适用,方差分析(analysis of variance, ANOVA)则是解决上述问题的重要分析方法.方差分析由R.A.Fisher(1923) ...

  2. asp.net mvc抓取微信文章里面所有的图片

    /// <summary> /// 下载指定URL下的所有图片 /// </summary> public class WebPageImage { /// <summa ...

  3. Mac机安装RedisCluster

    版本信息 mac版本:10.14.5 redis版本:5.0.7 Step 1 : 安装redis-cli命令 安装redis-cli命令方法有N种,这里只列举一种,参考地址:<在 Mac 上搭 ...

  4. 接口请求 URL转码

    什么是URL转码 不管是以何种方式传递url时,如果要传递的url中包含特殊字符,如想要传递一个+,但是这个+会被url会被编码成空格,想要传递&,被url处理成分隔符. 尤其是当传递的url ...

  5. (十二)SpringBoot之Spring-Data-Jpa(一)

    一.Spring-Data-Jpa概念 JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate.TopLink等. Spring D ...

  6. gin框架实现一个简单的项目 ③

    承接:gin框架封装自己的路由 ② 对于一个项目来说,需要将各个功能模块分开,也就是所谓的三层模型,这里介绍一下个人的做法: contorller主要负责路由 model主要负责程序输入输出的数据 s ...

  7. 用Altium Designer16 绘制STM32开发板PCB 笔记

    第一部分 Altium designer 软件概括 一.安装:要安装英文版,只安装pcb design和importers/exporters 二.设置:dxp-preferences我们关心的是sy ...

  8. CPU的基本组成

    1.CPU是用来运算的(加法运算.乘法运算.逻辑运算(与.或.非)等) 2.运算操作涉及到数据输入(input).处理.数据输出(output).A和B是输入数据,加法运算时处理.C是输出数据. 3. ...

  9. 封装jquery的ajax

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Python 3.7的新特性

    Python 3.7为数据处理.脚本编译和垃圾收集优化以及更快的异步I/O添加了许多新类.python是一种旨在简化复杂任务的语言.python 3.7的最新版本已经正式休闲鹿进入beta发布阶段.P ...