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

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

相关文章

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

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数据