首页 > 其他分享 >离散化,前缀和,差分

离散化,前缀和,差分

时间:2023-12-21 19:13:39浏览次数:29  
标签:前缀 int sum 矩阵 差分 离散 include

离散化,前缀和,差分

一维前缀和和差分之前学过不再记录

二维情况

前缀和

多维前缀和的普通求解方法几乎都是基于容斥原理

例如有这样一个矩阵,可以视为二维数组:

1 2 4 3
5 1 2 4
6 3 5 9

定义一个矩阵\(sum\)使得\(sum_{x,y}=\sum_{i=1}^{x}\sum_{j=1}^{y}a_{i,j}\)那么这个矩阵长这样:

1 3 7 10
6 9 15 22
12 18 29 45

第一个问题是递推求sum的过程,\(sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum_{i-1,j-1}+a_{i,j}\)
因为同时加了\(sum_{i-1,j},sum_{i,j-1}\)重复了\(sum_{i-1,j-1}\)减去
第二个问题是如何应用,譬如求\((x_1,y_1)-(x_2,y_2)\)子矩阵的和
答案\(sum_{x_2,y_2}-sum_{x_1-1,y_2}-sum_{x_2,y_1-1}+sum_{x_1-1,y_1-1}\)

差分

由sum逆推出来,即上述等式改为\(a_{i,j}=sum_{i,j}-sum_{i-1,j}-sum_{i,j-1}+sum_{i-1,j-1}\)

image.png

例题

image.png

// Problem: Air Cownditioning
// Contest: Virtual Judge - USACO
// URL: https://vjudge.net/problem/USACO-1156
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <array>
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;
typedef long long LL;
const int N = 1e5+10;
int n,a[N],b[N];
LL ans;
int main()
{	
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&b[i]);
		b[i]-=a[i];
	}
	for(int i=1;i<=n+1;i++)  ans+=max(b[i]-b[i-1],0);
	printf("%lld\n",ans);

	return 0;
}

标签:前缀,int,sum,矩阵,差分,离散,include
From: https://www.cnblogs.com/viewoverlooking/p/17919910.html

相关文章

  • 差分
    P3397地毯syoj1829.地毯二维差分板子。#include<bits/stdc++.h>usingnamespacestd;constintN=1010;intn,m;inta[N][N],s[N][N];intmain(){ scanf("%d%d",&n,&m); while(m--){ intx,y,xx,yy; scanf("%d%d%d%d",&x,&y,......
  • 【模版】前缀和
    问题引入:【洛谷P8218】##题目描述给定$n$个正整数组成的数列$a_1,a_2,\cdots,a_n$和$m$个区间$[l_i,r_i]$,分别求这$m$个区间的区间和。对于所有测试数据,$n,m\le10^5,a_i\le10^4$ 最朴素的想法,就是对于每次询问,我们都用for循环进行$[l_i,r_i]$区间的求和,不难......
  • 莫比乌斯函数平方前缀和
    考虑求\(\sum_{i=1}^n\mu(i)^2\)结论是\(\mu(i)^2=\sum_{j^2|i}\mu(j)\)考虑证明这个式子。先证明若\(\mu(i)\neq0\)此时\(\mu(i)^2=1\)显然只有\(j=1\)在右式造成贡献\(1\)等式成立。若存在\(j\neq1\)也在右式造成贡献,那么显然\(i\)有次数\(\ge2\)质因子了\(\mu(i)=0\)与......
  • R语言离散时间马尔可夫链(Markov chain)模型分类案例可视化分析
    全文链接:https://tecdat.cn/?p=34576原文出处:拓端数据部落公众号有许多用于马尔可夫链的复杂应用。这些包括用于将多态模型拟合为面板数据的msm和SemiMarkov,用于生存分析应用的mstate,用于估计3状态进行性疾病模型的转移概率的TPmsm,用于将马尔科夫模型应用于健康护理经济应用的he......
  • 枚举子集&高维前缀和学习笔记
    枚举子集首先\(n\)位二进制数可以表示一个大小为\(n\)的集合的所有子集。接下来的问题均用二进制数展开。一种暴力的想法是枚举所有数然后判一下是否满足条件,单次时间复杂度\(O(2^n)\),对所有数做一遍就是\(O(4^n)\)。发现有很多枚举是无用的,考虑怎么样让每次枚举出来的都......
  • 前缀和,差分,二叉堆
    目录前缀和一维数组前缀和二维数组前缀和差分二叉堆前缀和一维数组前缀和代码如下:for(inti=0;i<n;i++){if(i==0)y[i]=x[i];elsey[i]=y[i-1]+x[i];}或者for(inti=1;i<=n;i++){y[i]=y[i-1]+x[i];}二维数组前缀和代码如下:for(inti=1;i<=n;i++){f......
  • 离散傅里叶级数的matlab实例
    function[Xk]=dfs(xn,N)%computesdiscretefourierseriescoefficients%---------------------------------------------%[Xk]=dfs(xn,N)%Xk=DFScoeff.arrayover0<=k<=N-1%xn=oneperiodofperiodicsignalover0<=n<=N-1%N=Fundame......
  • 【算法】【线性表】最长公共前缀
    1 题目给k个字符串,求出他们的最长公共前缀(LCP)样例1:输入:k个字符串=["ABCD","ABEF","ACEF"]输出:"A"解释:公共最长前缀是"A".样例2:输入:k个字符串=["ABCDEFG","ABCEFG","ABCEFA"]输出:"ABC&q......
  • 1094. 拼车(差分&堆排序)
    Problem:1094.拼车文章目录题目思路Review差分数组定义区间加法减法更新差分数组:为啥这样更新思路1Code思路2Code题目车上最初有capacity个空座位。车只能向一个方向行驶(也就是说,不允许掉头或改变方向)给定整数capacity和一个数组trips,trip[i]=[numPassengersi,......
  • 差分
    P2367语文成绩P2367语文成绩-洛谷暴力模拟过不了,时间复杂度是\(\operatornameO(n^2)\)。差分思想对于数组\(a\),定义\(a\)的差分数组为\(b\),其中\(b_1=a_1,b_i=a_i-a_{i-1}(2\leqi\leqn)\)\(i\)12345678\(a_i\)11221335......