C221110C. SolarPea与网格

是怎么想到dp定义的?

思考下面这个情景:

  • 如果一个人在 \(x\), 另一个人在 \(y \ (x \lt y)\), 那么在 \(x\) 的人会把 \(x \lt i \lt y\) 的所有 \(i\) 全走一遍,走完之后 \(x + 1 = y\)。

对于这个情景,我们想到记 \(f[i]\) 表示一个人在 \(i - 1\),一个人在 \(i\) ,跳到终点后的max(前一个人得分 减去 后一个人得分)。

我们在转移时,先暂时忽略1,2两个点的贡献。最后加一个 \(a[1] - a[2]\) 就行。

答案: \(f[2]\)。

初始化:\(f[n] = 0\)。

\(n\) 是最后一步。因此 dp顺序 是\(n \sim i\) 。有转移:

\[f[i] = \max_{j \gt i} a[j] - (s[i] - s[j - 1]) - f[j]
\]

解释一下:由于每次是前一个人先跳,所以他肯定想拿远处很大的一个数(现在不拿就会被对手拿),然后让对手把这一段全部拿掉。最后再把上一步的贡献加上,注意两个人的相对位置翻转了,所以是 \(- f[j]\) 而不是 \(+ f[j]\)。

这是最朴素的式子。

答案就是 \(f[2]\)。

考虑简化这个式子

我也不知道是怎么注意到可以这么优化的。。。(注意力惊人)

考虑把 \(j \gt i\) 的所有 \(j\) 分成两类:

  • \(j = i + 1\), 则 \(f[i] = a[i + 1] - s[i] + s[i] - f[i + 1] = a[i + 1] - f[i + 1]\)。

  • \(j > i + 1\), 则 \(f[i] = \max_{j \gt i + 1} a[j] - s[j - 1] + s[i] - f[j]\)。

    ​ 又因为 \(f[i + 1] = \max_{j > i + 1} a[j] - s[j - 1] + s[i + 1] - f[j]\)。

    两式相减,则 $f[i + 1] - f[i] = s[i + 1] - s[i] = a[i + 1] $。

    ​ 则 \(f[i] = f[i + 1] - a[i + 1]\)。

综上:\(f[i] = |f[i+ 1] - a[i + 1]|\)。

考虑利用绝对值的一些性质

记 \(g[i]\) 表示当 \(a[n] = i\) 时,\(f_2 = g[i]\) 。

结合上面绝对值的式子,可以得到:

\[|\ |\ |\ |f[n] - a[n]\ | - a[n - 1]\ | - a[n - 2] - \cdots| - a[3]\ | = g[i] = f[2]
\]

每增加一个绝对值,对 \(g[i]\) 的影响就是先整体向右平移 \(a[n]\),然后 对于 \(i < a[n]\), 按 \(y\) 轴对称一下。

发现不是很好直接做。考虑用 \(deque\) 维护,每次在把 \(<a[i]\) 的一段元素再插入队首即可。

值域只有 \(10^6\), 可以直接维护。

如果 \(x\) 极大,那直接一步调到最后就可以(因为肯定最优)。

时间复杂度 \(O(\sum_a +q)\)。

/*
Think twice, code once
Please check the followings:
1.Array memory
2.Testing sentence
3.if_else condition
4.freopen
5.long long
*/
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
const int inf = 1e9;
list<int> g;
int n, q, cnt = 0;
int a[N], s[N], res[N * 10];
signed main(){
// freopen("test.in","r",stdin);
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
F(i, 1, n - 1) cin >> a[i], s[i] = s[i - 1] + a[i];
F(i, 0, s[n - 1] - s[2]) g.push_back(i);
F(i, 3, n - 1){
auto it = g.begin();
F(j, 1, a[i]) ++it, g.push_front(*it);//平移指针, 就相当于是平移图像了
}
for(auto x : g) res[++ cnt] = x;
cin >> q;
int x;
while(q --){
cin >> x;
if(x + 1 <= cnt) cout << res[x + 1] + a[1] - a[2] << '\n';
else cout << (x - s[n - 1] + s[2]) + a[1] - a[2] << '\n';
}
return 0;
}

C221110C. SolarPea与网格的更多相关文章

  1. C#中如何创建PDF网格并插入图片

    这篇文章我将向大家演示如何以编程的方式在PDF文档中创建一个网格,并将图片插入特定的网格中. 网上有一些类似的解决方法,在这里我选择了一个免费版的PDF组件.安装控件后,创建新项目,添加安装目录下的d ...

  2. pcl曲面网格模型的三种显示方式

    pcl网格模型有三种可选的显示模式,分别是面片模式(surface)显示,线框图模式(wireframe)显示,点模式(point)显示.默认为面片模式进行显示.设置函数分别为: void pcl:: ...

  3. 从点云到网格(三)Poisson重建

    Possion重建是Kazhdan等2006年提出的网格重建方法[1].Possion重建的输入是点云及其法向量,输出是三维网格.Poisson有公开的源代码[2].PCL中也有Poisson的实现. ...

  4. 从点云到网格(二)VRIP介绍

    VRIP(Volumetric Range Image Processing),顾名思义,是从深度图重建网格的一种方法.VRIP是Brian Curless和Marc Levoy在1996年提出来的方 ...

  5. UICollectionViewCell 网格显示数据

    using System; using System.Collections.Generic; using Foundation; using UIKit; namespace ddd { publi ...

  6. supermap布局设定地图网格及布局网格

    地图网格设定 LayoutElements elements = m_mapLayoutControl.MapLayout.Elements; //构造GeoMap GeoMap geoMap = n ...

  7. 如何用hypermesh生成包含interface的流体网格

    在计算气动声学的时候,有些情况是需要我们提取流体计算的结果作为声学分析的边界条件,但是,有些流体网格因为物理模型的问题需要我们设定interface,恰恰你是机械,对流体了解一点,又不想花费太多时间来 ...

  8. Unity3D 导航网格自动寻路(Navigation Mesh)

    NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...

  9. WebGIS中一种根据网格索引判断点面关系的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 判断点面关系的算法有很多,在我之前的博文中有一篇专门对其进行 ...

  10. Cesium原理篇:2最长的一帧之网格划分

    上一篇我们从宏观上介绍了Cesium的渲染过程,本章延续上一章的内容,详细介绍一下Cesium网格划分的一些细节,包括如下几个方面: 流程 Tile四叉树的构建 LOD 流程 首先,通过上篇的类关系描 ...

随机推荐

  1. grpc断路器之sentinel 荐

    背景 为了防止下游服务雪崩,这里考虑使用断路器 技术选型 由于是springboot服务且集成了istio,这里考虑三种方案 istio hystrix sentinel 这里分别有这几种方案的对比 ...

  2. 树莓派高级开发——“IO口驱动代码的编写“ 包含总线地址、物理_虚拟地址、BCM2835芯片手册知识

    微机总线地址 地址总线: 百度百科解释: 地址总线 (Address Bus:又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入) ...

  3. 解锁强强组合: 使用 Kafka + ClickHouse 快速搭建流数据实时处理平台(DoubleCloud 博客)

    我们想要解决的问题 让我们深入一个现实场景: 设想你负责汇总多个销售点系统产生的大量数据.这些数据需要被实时处理并在高级分析仪表板上展示,以提供全面的洞察. 在数据处理领域,速度至关重要.ClickH ...

  4. Python开发中,SQLAlchemy 的同步操作和异步操作封装,以及常规CRUD的处理。

    在我们使用Python来和数据库打交道中,SQLAlchemy是一个非常不错的ORM工具,通过它我们可以很好的实现多种数据库的统一模型接入,而且它提供了非常多的特性,通过结合不同的数据库驱动,我们可以 ...

  5. SparkStreaming本地化策略性能调优与使用场景分析

    1.背景介绍:平台使用的华为FI C203的版本,通过SparkStreaming消费kafka数据后,进行算法处理入库.其中在算法部分耗时为4秒,每个批的数据量在30MB左右.执行算法部分的算子分区 ...

  6. LaTeX 三种短横线的区别

    在 LaTeX 中,有三种基本的短横线,它们各自的长度和用法都有所不同.这三种短横线分别是连字符.短划线(或数字短横)和长划线.下面是它们的具体描述和用法: 连字符 (Hyphen, '-') 用法: ...

  7. 手把手在STM32F103C8T6上构建可扩展可移植的DHT11驱动

    前言 如何驱动一个你陌生的传感器呢?别看我,也别在网上死马当活马医!你需要做的,首先是明确你的传感器的名称,在这里,我们想要使用的是DHT11温湿度传感器 可能需要的前置知识 简单的OLED驱动原理 ...

  8. 【转】 Vue中import from的来源:省略后缀与加载文件夹

    原文地址 Vue中import from的来源:省略后缀与加载文件夹_超频化石鱼的博客-CSDN博客 ,原文地址排版格式可能更好,建议看原文,本文只是为了转载记录 Vue使用import ... fr ...

  9. Angular Material 18+ 高级教程 – CDK Drag and Drop

    前言 CDK Drag and Drop 和 CDK Scrolling 都是在 Angular Material v7 中推出的. 它们有一个巧妙的共同点,那就是与 Material Design ...

  10. ASP.NET Core C# 反射 & 表达式树 (第二篇)

    前言 上一篇讲到了各种反射的操作方式, 这一篇主要说说如何找到类型. Type Information 在找类型的时候, 除了依据简单的 string 以外, 还会用到很多类型属性来做判断. 比如它是 ...