首页 > 其他分享 >2023.02.15.差分

2023.02.15.差分

时间:2023-02-15 20:12:58浏览次数:55  
标签:15 数字 temp int 2023.02 cin 差分 数组

什么是差分

首先有一个数组a,在里面包含数据

我们定义一个数组b,使每个元素有一下规则 b[i] = a[i] -a[i-1](a从一开始保存数据,a[0] = 0)

也就是说,a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。换句话说,每一个a[i]都是b数组中从头开始的一段区间和。

a[1] = b[1]

a[2] = b[1] + b[2]

a[3] = b[1] + b[2] + b[3]

'

'

'

规律如上

对于差分,我们在使用时,比如某个区间都要加上a(a代表任意数字)使用差分就更简便

公式如下,设区间的左右边界为l和r,这时,b[l] += a;b[r+1] -= c;

例题如下

3729. 改变数组元素 - AcWing题库

在这里我首先使用的算法是贪心遍历,超时了

 

 

#include<iostream>
using namespace std;
int main(){
    int t;
    cin>>t;
    int n;
    int a[100]; // 存储原始数字
    int v[100]={0}; //用于保存心得数字
    int temp = 1; //在这里保存数组个数
    while(t>0){ //多次输入
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i]; //输入数字
            v[i]=0; 初始化为0
        }
        for(int i=1;i<=n;i++){
            v[temp]=0; //第一步操作在数组末尾添加0
           if(a[i]!=0){ //开始进行第二步操作 进行判断
               if(a[i]>=i){
                   for(int j=1;j<=temp;j++){
                       v[j]=1;
                   }
               }else if(a[i]<temp && a[i]>0){
                   for(int j=temp;j>temp-a[i];j--){
                       v[j]=1;
                   }
               }
           }
            temp++;
        }
        for(int s=1;s<=n;s++){
            cout<<v[s]<<" ";
        }
        cout<<endl;
        t--;
    }
    return 0;
}

 下面给出使用差分的做法

在题目中了解到,只要是对数组中的数字有操作就为1,没操作就为0

然后有关于区间的部分,在这里可以使用差分,对新数组中的数字加1,之后判断数组中的数字,如果大于0就置1,否则置0

#include<iostream>
using namespace std;
int main(){
    int t;
    cin>>t;
    int n;
    int v[200005]={0};
    int a[200005]={0};
    while(t>0){
        cin>>n;
        for(int i=1;i<=n;i++){
            v[i]=0;
            cin>>a[i];
        }
        for(int i=1;i<=n;i++){
            int x=min(a[i],i); //使用差分进行区间的加法
            v[i-x+1]++;
            v[i+1]--;
        }
        for(int i=1;i<=n;i++){
            v[i]+=v[i-1];//输出差分数组
        }
        for(int i=1;i<=n;i++){
            if(v[i]>=1){
                cout<<1<<" ";
            }else{
                cout<<0<<" ";
            }
            v[i]=0;
        }
        cout<<endl;
        t--;
    }
    return 0;
}

 

标签:15,数字,temp,int,2023.02,cin,差分,数组
From: https://www.cnblogs.com/hualuoyumufeng/p/17124494.html

相关文章

  • 闲话 23.2.15
    闲话vscode被我调ntt搞炸了所以这篇博客直接在cnblogs上写了寄(update:不是vscode,是除了浏览器外的部分今日推歌:一人行者-ilemfeat.心华我知道你可能想说什......
  • ARC154E Reverse and Inversion(*)
    ARC154EReverseandInversionACrecord......
  • 2023.02.10 模拟赛小结
    2023.02.10模拟赛小结目录2023.02.10模拟赛小结更好的阅读体验戳此进入赛时思路T1Code(生成器)Code(主程序)T2CodeT3正解T1CodeT2T3UPD更好的阅读体验戳此进入赛时思路T1......
  • 2023.02.13 模拟赛小结
    2023.02.13模拟赛小结目录2023.02.13模拟赛小结更好的阅读体验戳此进入赛时思路T1CodeT2CodeT3Code正解T1CodeT2CodeT3UPD更好的阅读体验戳此进入赛时思路T1CF840C......
  • 2023.02.15 模拟赛小结
    2023.02.15模拟赛小结目录2023.02.15模拟赛小结更好的阅读体验戳此进入赛时思路T1T2T3T4UPD更好的阅读体验戳此进入啥正经人会在模拟赛用仨小时将普及难度的期望DP转......
  • LG-P6157 有趣的游戏 题解
    LG-P6157有趣的游戏Solution目录LG-P6157有趣的游戏Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$个点的树,存在点权......
  • CF1534F2 Falling Sand (Hard Version)
    个人思路:每个点向相邻沙子连边,向本列和相邻\(2\)列下方第一个沙子连边。对于一个DAG,所有入度为\(0\)的点会覆盖全部点。我们缩点即可通过F1。但是这样做是过不了......
  • C语言学生课程选修管理系统[2023-02-15]
    C语言学生课程选修管理系统[2023-02-15]课程设计题目及要求本课题要求用C语言编写一个学生课程选修管理系统。学生课程选修系统用于学生选修学习课程。系统可以管理若干......
  • 算法杂记 2023/02/15
    算法杂记2023/02/15目录算法杂记2023/02/15453.MinimumMovestoEqualArrayElements462.MinimumMovestoEqualArrayElementsIInull今天分享的是两个力扣上的......
  • 15. CTFshow 萌新 web1
    一、代码<html><head><title>ctf.show萌新计划web1</title><metacharset="utf-8"></head><body><?php#包含数据库连接文件include("config.php");#判......