前缀和+差分+蓝桥双周赛:字符迁移

2024-04-09 06:28

本文主要是介绍前缀和+差分+蓝桥双周赛:字符迁移,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前缀和:

首先需要知道前缀和的概念:即数组该位置之前的元素之和。

还有一个重要的点,在进行前缀和的运算时,下标从1开始,设数组a[0]=0;

比如a[5] = {0,1,2,3,4};

求a[1]的前缀和:a[1];

求a[2]的前缀和:a[1]+a[2];

......

为什么下标要从1 开始:为了方便后面的计算,避免下标转换,设为零,不影响结果

前缀和的作用: 快速求出元素组中某段区间的和

一维数组的前缀和问题:

求数组a中(l,r)区间的和 --->用到前缀和

  1. 需要定义两个数组,第一个为原始数组(a[]),第二个为前缀和数组(s[])

    //初始化原数组
    int a[1000005] = {0};
    for (int i = 1; i <= n; i++) {cin>>a[i];
    }
  2. 公式:s[i] = s[i-1]+a[i]

    //前缀和的计算
    int s[1000005] = {0};
    for (int i = 1; i <=n ; i++) {s[i] = s[i-1]+arr[i];
    }

  3. 输入区间范围(l,r),s[r]-s[l-1]的结果就是所求区间的和

    sum[r] =a[1]+a[2]+a[3]+a[l-1]+a[l]+a[l+1]......a[r];
    sum[l-1]=a[1]+a[2]+a[3]+a[l-1];sum[r]-sum[l-1]=a[l]+a[l+1]+......+a[r];
    
    while (m-- !=0){int l,r;cin>>l>>r;cout<< s[r]-s[l-1] ;
    }

差分问题:

首先明白差分的概念:差分其实就是前缀和的逆运算

差分的作用:如果对某个区间需要每个元素加上C则需要使用差分来减少时间复杂度

给定a[1],a[2]....a[n];构造擦划分数组b[N];使得a[i] = b[i]+b[2]+....+b[i];

差分的重点是:构造辅助数组b[]

解释

b[1] = a[1] b[2] = a[2] - a[1] b[3 ]= a[3] - a[2] ... b[n] = a[n] - a[n-1]

两个数组:a[],b[],a[]称为b[]的前缀和,b[]称为a[]的差分

差分的下标也是从1开始;

核心操作:

将a[L~R]全部加上C,等价于:b[L] +=C, b[R+1] -=C;

一维数组的差分问题:

  1. 首先初始化数组s[]

    int b[100005] = {0};
    for (int i = 1; i <=n ; i++) {cin>>a[i];
    }
  2. 按照上面构造数组方式构造b[]数组(两种方法),公式:b[i] = a[i]-a[i-1]

    //构造差分数组
    for (int i = 1; i <=n ; i++) {b[i] = a[i]-a[i-1];
    }
    //插入方法:假设a[]中全部为0 则b[]也全部为0,可以执行插入操作
    for(int i = 1; i <= n; i++){insert(i,i,a[i])
    }

    插入操作:

    void insert(int l,int r,int c){b[l] +=c;b[r+1] -=c;
    }

  3. 将所求区间(l,r)在b[]数组划分出来并加上c,公式:b[l] +=c,b[r+1] -=c;

    int l,r,c;
    cin>>l>>r>>c;
    b[l] +=c;
    b[r+1] -=c;

    因为a[]数组是b[]数组的前缀和,b[]是a[]的差分,所以在b[]的某个区间上+c会影响的a区间上的结果

由于差分可以让一个序列中某个区间内的所有值均加上或减去一个常数。

可以将对a数组任意区间的同一操作优化到O(1)。实现算法的优化。

下面是题目

原题用暴力的解法是没法通过的,所以我用的差分的方法写。

#include <bits/stdc++.h>
using namespace std;
const int N = 200100;
typedef long long ll;
ll a[N],b[N],n,m,l,r,k;
string s;
char c[N];int main()
{cin>>n>>m;cin >> s;for(int i=1;i<=n;i++){a[i] = s[i-1] - 'a';b[i] = a[i] - a[i-1];
}while(m--){cin>>l>>r>>k;b[l] += k;b[r+1] -= k;}for(int i=1;i<=n;i++)a[i] = a[i-1] + b[i];for(int i = 1;i<=n;i++){c[i] = (a[i])%26 + 'a';cout<<c[i];}return 0;
}

这篇关于前缀和+差分+蓝桥双周赛:字符迁移的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

SQL Server数据库迁移到MySQL的完整指南

《SQLServer数据库迁移到MySQL的完整指南》在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从SQLServer转向MySQL,原因可能是成本、性能、跨平台兼容性等... 目录一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据二、迁移工具的选择2.1

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

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