【笔记】差分及相关应用

差分的题没有做过几个,最典型的应该是NOIP2012借教室吧![跳转链接](https://www.luogu.org/problemnew/show/P1083)

先从这个题目说起,刚开始做的时候没有经验写了个奇怪的东西,事后学习了一下,实际上一维差分也就那么点东西,先对diff数组预处理然后扫一遍数组就结束了!

给一个题面 [跳转链接](https://www.luogu.org/problemnew/show/U50026)

然后到同样的一个题目到二维就不好做了,我们首先有两种方案:

First : 我们可以将二维差分转化为无数个一维差分进行处理,这样复杂度就为原来的两倍

Second : 运用前缀和来对diff数组进行处理

并没有理解如何将差分和前缀和结合起来,设题目给予了我们一个矩阵,左下角坐标为(x1, y1),右上角坐标为(x2, y2)矩阵内所有元素加上或减去一个值,正常情况下首先要想到的是二维树状数组,有能力的可以写一个二维线段树。毕竟树状数组的调用是O(logn),二维就要再乘一个logn,明显就比不上O(1)的差分(指当数据范围吓人的情况下)。

怎么用二维数据范围进行处理呢?

直接说了,要修改diff的四个点,分别为P1(x1,y1),P2(x2+1,y1),P3(x1,y2+1),P4(x2+1,y2+1),分别为P1,P4加上所需要的值,为P2,P3减去所需要的值,然后前缀和处理

```
ans[i][j] = ans[i-1][j]+ans[i][j-1]-ans[i][j]+diff[i][j]

```

在我们扫数组的时候,也就进行前缀和处理的时候,当P(i,j)在此矩阵内时包含点P1,在矩阵外有六种情况一一列出来

1. 当i<x1或j<y1时不包含P的任何点

2. 当x1<=i<=x2且j>y2时包含点P1P3,等于重置为0

3. 当y1<=j<=y2且i>x2包含点点P1P2,同理

4. 当然当i>x2 , j > y2时自然包含四个点

非常巧妙,扫描数组时只要写在里面自然就只会包含P1一个点

做到了运输计划,在一颗树上任意选出两点然后标记两点之间的路径,然后重复选出若干点,如何找到一条边被所有路径覆盖的问题。

树上差分,建一个数组,对第i个元素维护第i个元素到父节点的边的路过的次数... 对于任意的两个节点,只要先把他们各个节点的权值+1,然后将他们LCA的权值-2,按照dfs序进行遍历对当前第i个节点的话将其父节点的权值加上当前i节点权值结束了

猜你喜欢

转载自www.cnblogs.com/NHDR233/p/11246680.html
今日推荐