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

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

相关文章

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

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

Linux Centos 迁移Mysql 数据位置

转自:http://www.tuicool.com/articles/zmqIn2 由于业务量增加导致安装在系统盘(20G)磁盘空间被占满了, 现在进行数据库的迁移. Mysql 是通过 yum 安装的. Centos6.5Mysql5.1 yum 安装的 mysql 服务 查看 mysql 的安装路径 执行查询 SQL show variables like

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

【LeetCode热题100】前缀和

这篇博客共记录了8道前缀和算法相关的题目,分别是:【模版】前缀和、【模版】二维前缀和、寻找数组的中心下标、除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和。 #include <iostream>#include <vector>using namespace std;int main() {//1. 读取数据int n = 0, q = 0;ci