一维 二维求前缀和、差分

简介: 一维 二维求前缀和、差分

一维前缀和


活动 - AcWing


S[i] = a[1] + a[2] + ... a[i]

a[l] + ... + a[r] = S[r] - S[l - 1]

 final static int N=100010;
    public static void main(String[] args) {
        int []arr=new int[N];
        int []sum=new int[N];
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        for (int i = 1; i <=n; i++) {
            arr[i]= sc.nextInt();
        }
        for (int i = 1; i <=n; i++) {
            sum[i]=sum[i-1]+arr[i];
        }
        while (m--!=0){
            int l=sc.nextInt();
            int r=sc.nextInt();
            System.out.println(sum[r]-sum[l-1]);
        }
    }


二维前缀和(子矩阵求和)


活动 - AcWing


S[i, j] = 第i行j列格子左上部分所有元素的和

以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:

S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]


final static int N=1010,M=1010;
    public static void main(String[] args) {
    int [][]arr=new int[N][M];
    int [][]s=new int[N][M];
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    int m=sc.nextInt();
    int q=sc.nextInt();
        for (int i = 1; i <=n; i++) {
            for (int j =1; j <=m; j++) {
                arr[i][j]= sc.nextInt();
            }
        }
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <=m; j++) {
                s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+arr[i][j];
            }
        }
        while (q--!=0){
            int x1=sc.nextInt();
            int y1=sc.nextInt();
            int x2=sc.nextInt();
            int y2=sc.nextInt();
            System.out.println(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
        }
    }

一维差分


活动 - AcWing

给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c


    final static int N=100010;
    static int [] s=new int[N];
    public static void main(String[] args) {
        int []arr=new int[N];
      Scanner sc=new Scanner(System.in);
      int n=sc.nextInt(),m= sc.nextInt();
        for (int i = 1; i <=n; i++) {
            arr[i]= sc.nextInt();
        }
        for (int i = 1; i <=n; i++) {
            insert(i,i,arr[i]);
        }
        while (m--!=0){
            int l=sc.nextInt(),r=sc.nextInt(),c=sc.nextInt();
            insert(l,r,c);
        }
        for (int i=1; i <=n; i++)  s[i]+=s[i-1];
        for(int i=1;i<=n;i++)  System.out.print(s[i]+" ");
        System.out.println();
    }
    public static void insert(int l,int r,int c){
        s[l]+=c;
        s[r+1]-=c;
    }


二维差分


活动 - AcWing


给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:

S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c


    final static int N=1010;
    static int [][]S=new int[N][N];
    public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int [][]arr=new int[N][N];
    int n= sc.nextInt(),m= sc.nextInt(),q= sc.nextInt();
        for (int i =1; i <=n; i++) {
            for (int j =1; j <=m; j++) {
                arr[i][j]= sc.nextInt();//读入原始数组
                insert(i,j,i,j,arr[i][j]);//构建差分数组S
            }
        }
        while (q-->0){
            int x1= sc.nextInt(),y1= sc.nextInt(),x2= sc.nextInt(),y2= sc.nextInt(),c= sc.nextInt();
            insert(x1,y1,x2,y2,c);
        }
        for (int i =1; i <=n; i++) {
            for (int j =1; j <=m; j++) {
               S[i][j]+=S[i][j-1]+S[i-1][j]-S[i-1][j-1];//求差分数组的前n项和
                System.out.print(S[i][j]+" ");//输出最后结果
            }
            System.out.println();
        }
    }
    public static void insert(int x1,int y1,int x2,int y2,int c){
        S[x1][y1]+=c;
        S[x2+1][y1]-=c;
        S[x1][y2+1]-=c;
        S[x2+1][y2+1]+=c;
    }
相关文章
|
存储 数据安全/隐私保护
zookeeper 节点介绍及节点常用命令总结
zookeeper 节点介绍及节点常用命令总结
622 4
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
JSON 供应链 API
1688寻源通API接口概述
1688寻源通API接口是1688开放平台为采购商提供的商品/供应商搜索与匹配服务接口
|
人工智能 IDE 程序员
与1.0 相比,通义灵码 2.0 AI 程序员有哪些功能、亮点、优势、场景?
通义灵码2.0相比1.0新增了工程级编码任务、单元测试生成和图片多模态问答等功能,支持多文件代码修改、批量生成单元测试及根据图片内容生成代码建议。亮点包括支持主流IDE、垂直智能体覆盖更多场景、企业级检索增强和灵活对话交互体验。技术优势涵盖多模态上下文感知、快速推理、企业数据个性化及一流代码生成效果。典型应用场景有新功能开发、跨语言编程、单元测试自动生成和错误排查修复。
1396 7
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
538 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
581 2
|
人工智能
写歌词的技巧和方法入门指南:点亮音乐创作梦想,妙笔生词智能写歌词软件
对于怀揣音乐创作梦想的人来说,写歌词是关键一步。本文介绍写歌词的技巧和方法,推荐使用《妙笔生词智能写歌词软件》辅助创作,涵盖 AI 智能写词、押韵优化等功能。积累灵感素材,确定主题,构建歌词结构,使用简洁而富有感染力的语言,让创作更轻松。
|
存储 监控 NoSQL
MongoDB的应用场景非常广泛
MongoDB的应用场景非常广泛
759 6
|
传感器 物联网 5G
5G的三大主要特性:解锁未来无限可能
5G的三大主要特性:解锁未来无限可能
2540 1
|
Python
解决Pycharm安装后无法导入库的问题
解决Pycharm导入库问题:进入Settings,选择Project的`Python Interpreter`,点击Add Interpreter。删除`.venv`文件夹内容,然后关闭并重启Pycharm以初始化新环境,现在可以正常导入库了。
960 1
解决Pycharm安装后无法导入库的问题