《算法笔记》第4章 入门篇(2)第13章 专题扩展

1.分块思想:

在这里插入图片描述
在这里插入图片描述

2.树状数组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//该函数是返回前x个整数之和
int getSum(int x)
{
    int sum=0;
    for(int i=x; i>0; i-=lowbit(i))
    {
        sum+=c[i];
    }
    return sum;
}

在这里插入图片描述
在这里插入图片描述

void update(int x, int v)
{
    for(int i=x; i<=n; i+=lowbit(i))
        c[i]+=v;
}

在这里插入图片描述

数状数组最经典的应用

在这里插入图片描述

在这里插入图片描述

#include<iostream>
using namespace std;

const int maxn=10;

#define lowbit(i) ((i)&(-i))


int n;

int c[maxn]={0};

void update(int x, int v)
{
    for(int i=x; i<maxn; i+=lowbit(i))
    {
        c[i]+=v;
    }
}

int getNum(int x)
{
    int sum=0;
    for(int i=x; i>0; i-=lowbit(i))
    {
        sum+=c[i];
    }
    return sum;
}

int main()
{
    cin >> n;
    int temp;
    for(int i=0; i<n; i++)
    {
        cin >> temp;
        update(temp,1);
        cout << getNum(temp-1) << endl;  //getNum(temp)就是统计temp左边小于等于temp的值的个数,而使用temp-1就是纯粹的去寻找比temp小的值的个数
    }

}


在这里插入图片描述

采用离散化的方式统计序列中在元素左边比该元素小的数字

在这里插入图片描述

#include<iostream>
#include<cstring>
using namespace std;

//本题虽然是找在A[i]之前所有比A[i]小的数字的个数之和,注意我们随意输入数字,也不经过排序,但是c数组是统计x出现的个数

const int maxn=20;

#define lowbit(i) ((i)&(-i))   //定义一个宏

int c[maxn];

void update(int x,int v)  //对x位置的数增加v  统计数字x出现的次数
{
    for(int i=x; i<maxn; i+=lowbit(i))   //注意i每次增大lowbit(i)
    {
        c[i]+=v;    //比如输入5它就在5这个位置将数字增加1  比如输入3它就在3这个位置数字增加1
    }
}

int getNum(int x)   //统计从位置x开始一直到前面所有的数字之和
{
    int sum=0;
    for(int i=x; i>0; i-=lowbit(i)) //注意i每次递减lowbit
    {
        sum+=c[x];
    }
    return sum;
}


int main()
{
    int n;
    cin >> n;
    int temp;
    memset(c,0,sizeof(c));
    for(int i=0; i<n; i++)
    {
        cin >> temp;
        update(temp,1);
        cout << getNum(temp-1) << endl;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值