栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

前缀和与差分(初学者)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

前缀和与差分(初学者)

1).前缀和算法 用于更快捷简便地解决关于“序列的前n项和”或由其延伸的一系列问题。

随着编写代码的熟练大多数人容易使用区间求和:

#include
using namespace std;

int main()
{
    int n,i;
    cin>>n;
    int a[n];
    for(i=0;i>a[i];}
    int sum=0,l,r;
    cin>>l>>r;
    for(i=l;i<=r;i++){
    sum=a[i]+sum;}
    cout< 

这种数据量稍微大一点就有可能超时,而我们如果使用前缀和的方法来做的话就能够将时间复杂度大幅度降低,提高运算效率。

1.一维前缀和: 用于解决下标区间内的数组的和可用前缀和相减;也可扩展用于统计某个下标区间内某个数字出现的个数
#include
using namespace std;

int main()
{  
    int n,i;
    cin>>n;
    int a[n],sum[n];
    for(i=1;i<=n;i++)
  {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
  }
    return 0;
}
2.二维前缀和:

由一维前缀和拓展而来常用于解决类似   【 激光炸弹  ​​​​​​】问题。

#include
using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;
    int a[n][m],sum[n][m];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
        }
    }
    return 0;
}
2).差分算法 差分算法就是基于前缀和延伸出的一种解题思想常用于解决区间需要大量修改问题。(差分在某种程度上可以看成前缀和的逆运算)

例题:假如有一个年级考试,批卷时发现有一题全体改错了,需要全部加x分。按照朴素暴力的思想,就是将以前所有的批了的试卷全部再拿出来,再一张张的加分。这当然过于的慢,所以便有了差分的这种算法:说白了,就是将一整个考场的试卷封面上写上“加x分”,这样便省去了许多功夫。

#include 
using namespace std;

int main()
{
    int SIZE=10005;

    int a[SIZE],c[SIZE*10];
    int ans=0,ask,n,m,x,y,w;
    cin>>n;    //输入数列长度和修改次数
    for (int i=1; i<=n; i++)
        cin>>a[i];    //输入数列
    cin>>x>>y>>w; //从x到y全部加w
    c[x]+=w;      //x处标记+w
    c[y+1]-=w;       //y+1处标记-w
    cin>>ask;        //输入查询下标
    for (int i=1; i<=ask; i++)
   {
       ans+=c[i];
       cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/718738.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号