一维 二维求前缀和、差分

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

一维前缀和


活动 - 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;
    }
相关文章
|
Kubernetes Cloud Native 关系型数据库
使用Zadig从0到1搭建持续交付平台(上)
使用Zadig从0到1搭建持续交付平台
使用Zadig从0到1搭建持续交付平台(上)
|
Linux Python 开发工具
Linux编译安装python2.7.5的步骤
Linux编译安装python2.7.5的步骤 发布时间:2014-03-27 来源:服务器之家 1. 下载python2.7.5,保存到 /data/qtongmon/software http://www.
2251 0
|
存储 数据安全/隐私保护
zookeeper 节点介绍及节点常用命令总结
zookeeper 节点介绍及节点常用命令总结
442 4
|
JSON 前端开发 JavaScript
使用html,css,js 实现一个龙年春节祝福卡片效果
使用html,css,js 实现一个龙年春节祝福卡片效果
396 123
|
10月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
11月前
|
机器学习/深度学习 人工智能 大数据
量子计算的现状与未来:从实验室到商用
量子计算正从理论探索迈向实际应用,全球科技巨头和科研机构积极研发,已在特定任务上展现巨大优势。本文探讨量子计算的现状、挑战、发展趋势及商用潜力,涵盖药物研发、金融工程、大数据处理等领域,展望其未来对各行业的深远影响。
|
10月前
|
SQL 运维 数据库
微服务改造:踩过的坑!
在技术团队从2~3人发展到百人规模的过程中,我见证了技术栈从JSP到前后端分离+SpringCloud微服务架构的演变。期间经历了系统拆分、数据库独立等挑战,如接口调用复杂、职责划分模糊、日志分散等问题。虽然初期遇到不少坑,但最终提升了系统的解耦和应对变化的能力。
86 0
|
JavaScript
jQuery 遍历 - 祖先
jQuery 遍历 - 祖先
84 5
|
监控 算法 Java
压测分析Java内存和CPU暂用
7月更文挑战第7天
186 5
|
机器学习/深度学习 自然语言处理 搜索推荐
探索文本向量化的新高峰:合合信息acge_text_embedding 模型原创
文本向量化方法包括词袋模型、TF-IDF、词嵌入和预训练模型(如BERT、GPT)。词嵌入如Word2Vec、GloVe和FastText捕捉单词语义,预训练模型则保留上下文信息。C-MTEB是中文文本嵌入评估平台,测试模型在检索、相似性、分类等任务的性能。合合信息的acge_text_embedding模型在C-MTEB中表现优秀,适用于情感分析、文本生成等任务,具有高分类聚类准确性、资源效率和场景适应性。技术突破涉及数据集优化、模型训练策略和持续学习,提供Demo展示如何使用acge模型计算句子相似度。acge_text_embedding是提升文本处理效率和智能化的有力工具。
1383 2
探索文本向量化的新高峰:合合信息acge_text_embedding 模型原创