首页 > 其他分享 >分治与归并

分治与归并

时间:2023-11-20 20:34:33浏览次数:31  
标签:Node 归并 rsum int 分治 isum msum lsum

归并算法: 递归+合并,在递归的途中进行分治。递归会把区间越分越小,此时就可以进行分治操作。

可以使用全局变量进行分治操作。

可以在函数中进行分治操作,在递归树中实现pushup和pushdown,记性父节点与子节点的关系计算。

 

 

class Solution {
public:

    struct Node {
        int lsum, rsum, isum, msum;
    };

    Node pushup(Node &a, Node &b) {
        int isum = a.isum + b.isum;
        int lsum = max(a.lsum, a.isum + b.lsum);
        int rsum = max(b.rsum, a.rsum + b.isum);
        int msum = max(max(a.msum, b.msum), a.rsum + b.lsum);
        return {lsum, rsum, isum, msum};
    }

    Node get(vector<int> &a, int l, int r) {
        if(l == r) {
            return Node{a[l], a[l], a[l], a[l]};
        }
        int mid = l + r >> 1;
        auto sl = get(a, l, mid), sr = get(a, mid + 1, r);
        return pushup(sl, sr);
    }

    int maxSubArray(vector<int>& nums) {
        return get(nums, 0, nums.size() - 1).msum;
    }
};

 

标签:Node,归并,rsum,int,分治,isum,msum,lsum
From: https://www.cnblogs.com/zk6696/p/17844776.html

相关文章

  • 点分治学习笔记(未完成)
    前言点分治不应该算数据结构,它的本质是分治的思想。问题引入对于一个序列\(a\),求是否存在\((l,r)\)使得\(\sum\limits_{i=l}^{r}a_i=k\)。\(n\le10^6,|a_i|\le10^9\)。本题显然是有其它的做法的,由于学的是点分治,所以考虑分治做法。首先对\(a\)求前缀和,记这个数组为......
  • 算法学习笔记(1):CDQ分治
    CDQ分治对比普通分治把一种问题划分成不同子问题,递归处理子问题内部的答案,再考虑合并子问题的答案。再看CDQ分治有广泛的应用,但我不会。但在接下来的题目体会到大概:将可能产生的对于答案的贡献分为两类:\(f(l,mid)\)与\(f(mid+1,r)\)内部产生的贡献,其贡献已在递......
  • 归并排序C++实现
    把归并排序看作二叉树的后序遍历的确是一种好的思路,使代码的逻辑更加清晰。但是具体实现还是遇到了很多的困难。有太多报错,自己也觉得有些莫名其妙。但是事后看来,大多数还是自己粗心所致。以后都可以采用这个框架来处理需要归并排序的问题。classSolution{public:vect......
  • 06-归并排序
    6.归并排序6.1基础归并排序分层两半,而后合并。重点:MargeSort把比较变成了有序的东西,这个有序的东西可以帮我们做很多事情6.1.1递归的归并排序两个函数:分:process(arr,L,R)-->保证[L,R]范围上有序。publicstaticvoidmSort(int[]arr,intl,intr){ if(l==r){......
  • 根号分治
    Problem给定一个长度为\(S\)字符串\(s\)与一个正整数\(q\),接下来有\(q\)次询问,第\(i\)次询问给出一个长度为\(T_i\)字符串\(t_i\),求\(t_i\)在\(s\)的出现次数。保证\(S,q,\sum^q_{i=1}T_i\leq10^5\)。Solution后缀自动机,但是我不会。注意到\(\sum^q_{i=1}......
  • 分治算法(C语言)
    一、棋盘覆盖问题1、问题2、分析(1)当k>0时,将2k×2k棋盘分割为4个(2k-1)×(2k-1)子棋盘,如图(a)所示。每一次分解,都将原本大小的棋盘,划分为四份,即行号和列号各自缩减一半。(2)特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。(3)为将无特殊方格子棋盘转化为特......
  • 归并排序--排序算法
    归并排序介绍归并排序和快速排序一样,都是基于分治思想的应用。通过递归,不断将原数列分为两个数列,然后再分别使其有序,最后通过归并将两个有序子数列合并为新的有序数列。值得注意的是,与快速排序不同,归并排序是稳定的。代码实现voidmerge_sort(inta[],intl,intr){......
  • 归并排序
    //归并排序#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e6+5;intn,a[N],b[N];voidh(intl1,intr1,intl2,intr2){//归操作//l1是第一部分的左指针r1是第一部分的右指针//l2是第二部分的左指针r2是第二部分的右指针 intt=1;......
  • 分治法
    什么是分治法分解-->解决-->合并归并排序#include<stdio.h>#include<math.h>//voidMerge(intA[],intp,intq,intr){ inti,j,k; intL[50],R[50]; intn1=q-p+1,n2=r-q; //为L和R数组赋值 for(i=0;i<n1;i++){ L[i]=A[p+i]......
  • F. Unique Occurrences(线段树分治+可撤销并查集)
    F.UniqueOccurrences假如我们删除所有权值为x的边,那么所有权值为x的边对答案的贡献就是\(\sumsz[u]*sz[v]\)sz表示两个联通块的大小,且(u,v)的边权为x我们可以用可撤销并查集来进行处理,简单来说就是将一条边的存在时间看作区间,然后挂到线段树上,然后遍历到每个叶子的时候进行......