二阶差分题单

2024-04-16 03:36
文章标签 二阶 差分 题单

本文主要是介绍二阶差分题单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理

差分与前缀和互为逆运算,故将二阶差分数组进行两次前缀和操作得到结果。

下面我们用一个例子理解:

原差分数组
i0123456789
a[i]1001000000
一次前缀和操作后的数组
i0123456789
a[i]1112222222
两次前缀和操作后的数组
i0123456789
a[i]12357911131517

                可以看到两次前缀和数组结果中,

                0 <= i <= 2序列①结果为 1 2 3,形成公差 d = 1 的等差数列

                3 <= i <= 9序列②结果为 5 7 9 11 13 15 17,形成公差 d = 2 的等差数列

                这是因为 原数组中 a[0] = 1, a[3] = 1。一次前缀和后序列①的每个数都变为了 1,

                序列②的每个数都变为了 2。再进行一次前缀和后序列①内相邻的两个数相差 1,

                序列②内相邻的两个数相差 2。

同理推广,二阶差分是一个公差叠加的过程,即对原数组的某个数操作就是改变以从当前数开头的序列的公差。

总结起来:

我们想要得到区间为 [l, r] ,公差为 d 等差序列 d, 2 * d, ... , d * (r - l),

只需a[l] += d, a[r + 1] = -d,再进行两次前缀和。

想要得到区间为 [l, r] ,以 x 为首项,公差为 d 等差序列 x + d, x + 2 * d, ... , x + d * (r - l)。

那么可以做以下操作 ①a[l] += x, a[l + 1] += -x。②a[l] += d, a[r + 1] = -d。③两次前缀和

题目

 绝世武功(板子题)

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{int n, m, ans = 0; cin >> n >> m;vector<int>a(n + 1);for(int i = 1; i <= m; i ++){int  l, r, s, e; cin >> l >> r >> s >> e;int d = (e - s) / (r - l);a[l] += s;a[l + 1] += (d - s);a[r + 1] += (-e - d);a[r + 2] += e;}for(int i = 1; i <= n; i ++) a[i] += a[i - 1];for(int i = 1; i <= n; i ++) a[i] += a[i - 1];for(int i = 1; i <= n; i ++) ans += a[i];//, cout << a[i] << " ";// cout << '\n';cout << ans << '\n';return 0;
}

P8811 [蓝桥杯 2022 国 C] 六六大顺(高精度 + 二阶差分)

观察到111 x 111 = 12321,两个等差序列可以用二阶差分解决

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 25;signed main()
{	ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n; cin >> n;int mx = 2e7 + 10;vector<int>a(mx);for(int i = 1; i <= n; i ++){a[1] += 36;a[i + 1] -= 2 * 36;a[2 * i + 1] += 36;}for(int i = 1; i <= 2 * n + 1; i ++) a[i] += a[i - 1];for(int i = 1; i <= 2 * n + 1; i ++) a[i] += a[i - 1];int t = 0;int cnt = 0;for(int i = 1; i < mx; i ++){a[i + 1] += a[i] / 10;a[i] %= 10;if(a[i]) cnt = i;}for(int i = cnt; i >= 1; i --) cout << a[i];cout << '\n';
}

P5026 Lycanthropy(二阶差分)

等差数列变化图,直接上二阶差分

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 25; 
signed main()
{	ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n, m; cin >> n >> m;vector<int>a(2e6 + 10);int da = 40010;for(int i = 1; i <= n; i ++){int v, x; cin >> v >> x;a[x - 3 * v + 1 + da] += 1;a[x - 2 * v + 1 + da] += -2;a[x + 1 + da] += 2;a[x + 2 * v + 1 + da] += -2;a[x + 3 * v + 1 + da] += 1;}for(int i = 1; i <= 2e6; i ++) a[i] += a[i - 1];for(int i = 1; i <= 2e6; i ++) a[i] += a[i - 1];for(int i = 1; i <= m; i ++) cout << a[i + da] << " ";cout << '\n';
}

这篇关于二阶差分题单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907699

相关文章

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

RS485差分信号不对称

在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信

【POJ】3169 Layout 【HDU】3592 World Exhibition 差分约束

传送门:  【POJ】3169 Layout、【HDU】3592 World Exhibition 题目分析:我会说我只是凭直觉写的吗。。。。。。。 如果有B-A>=C形式的,则建边(B,A,-C)。 如果有B-A<=C形式的,则建边(A,B,C)。 对所有的点X,建边(X,X-1,0)。 最后跑一遍最短路。如果存在负环输出-1,如果点N不可达输出-2,否则输出点N的值(最短路径长

Xilinx FPGA 原语解析(二):IBUFDS差分输入缓冲器(示例源码及仿真)

目录 前言: 一、原语使用说明 二、原语实例化代码模版 三、使用示例 1.设计文件代码 2.仿真文件代码 3.仿真结果 前言: 本文主要参考资料xilinx手册,《Xilinx 7 Series FPGA and Zynq-7000 All Programmable SoC Libraries Guide for HDL Designs》UG768 (v14.7) Octob

差分、前缀和

P8218 【深进1.例1】求区间和  (前缀和) #include <bits/stdc++.h>using namespace std;int n, m, a[100010], sum[100010], ans, l, r;int main(){scanf("%d", &n);for(int i=1; i<=n; ++i){scanf("%d", &a[i]);sum[i]=sum[

差分约束题目

P5960 【模板】差分约束算法 #include <bits/stdc++.h>using namespace std;int n, m, v, u, w, dis[5001];bool flag;struct node{int from, to, weight;}edge[5001];int main(){cin >> n >> m;memset(dis, 0x3f, size

差分传输与单端传输

差分与单端传输 本页讨论模拟信号传输中的两个概念:“单端”和“差分”。模拟信号用于将模拟仪器的输出传送到数字转换器。虽然数字信号对干扰的容忍度相对较高,但模拟信号却可能受到环境中电磁波的干扰和改变。本文档将解释这一问题,并描述一个解决方案。之后,它还将简要介绍双绞线电缆,然后讨论Güralp差分设备与非Güralp单端设备之间的接口问题。 概念 电磁感应 詹姆斯·克拉克·麦克斯韦的方程展示