Part 1:CDQ分治 CDQ分治讲解博客 可以把CDQ分治理解为类似与归并排序求逆序对个数的一种分治算法(至少我现在是这么想的)。先处理完左右两边各自对答案的贡献,在处理跨越左右两边的对答案的贡献。 例题: 逆序对(二维偏序) 过水,不讲。 三维偏序 第一维先sort,第二维由归并保证,第三维在 ...
分类:
其他好文 时间:
2020-07-14 15:08:47
阅读次数:
90
面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 归并排序简介: 归并排序(MERGE-SORT ...
分类:
编程语言 时间:
2020-04-24 21:28:34
阅读次数:
78
首先明白逆序对的定义,逆序对就是数组中两个元素前大后小,我们就称这两个元素为一组逆序对。 接着看题目: 我们利用分治的思想,将区间一分为二,然后得到了逆序对的存在情况共三种: 1.两个元素都在左侧区间。 2.两个元素都在右侧区间。 3.两个元素一个在左,一个在右。 那么很明显我们分治的去解决这个问题 ...
分类:
编程语言 时间:
2020-01-23 22:49:55
阅读次数:
85
逆序对 首先我们来认识一下什么叫做逆序对:如果对于 i<j,a[i]>a[j],那么a[i]和a[j]就是一对逆序对 树状数组求逆序对 我们挨个把a数组放进树状数组里,对于每一个a[i],统计a[1...i-1]中有多少个数比a[i]大,就有多少对逆序对 归并排序求逆序对 归并排序是一种基础的排序方 ...
分类:
其他好文 时间:
2019-11-04 17:23:30
阅读次数:
108
emmmmm不难吧。。 主要就是在最开始要把题目抽象化,转为求逆序对个数,那之后就很简单了,离散化+归并排序求逆序对,取模输出就结束了 ...
分类:
其他好文 时间:
2019-10-09 22:32:25
阅读次数:
101
归并排序(merge sort) 顾名思义,这是一种排序算法,时间复杂度为O(nlogn),时间复杂度上和快排一样 归并排序是分治思想的应用,我们先将n个数不断地二分,最后得到n个长度为1的区间,显然,这n个小区间都是单调的,随后合并相邻的两个区间,得到n/2个单增(减)的区间,随后我们继续合并相邻 ...
分类:
编程语言 时间:
2019-09-02 23:50:01
阅读次数:
110
题目链接:https://vjudge.net/problem/POJ-2299 题意:给定一个序列,每次只能交换邻近的两个元素,问要交换多少次才能使序列按升序排列。 思路:本质就是求逆序对。我们用归并排序求逆序对,这也是简单的cdq分治。 ...
分类:
编程语言 时间:
2019-08-27 11:06:04
阅读次数:
85
代码 include using namespace std; typedef long long ll; const int N = 2e5 + 10; int a[N],b[N]; ll ans = 0; define sc scanf define pr printf define rep(i ...
分类:
编程语言 时间:
2019-08-13 15:45:16
阅读次数:
189
#include #include using namespace std; int n; const int N=500003; int d[N],t[N]; long long sum; void CDQ(int l,int r) { if(l==r) return ; int t1=l,mid... ...
分类:
编程语言 时间:
2019-08-03 11:19:42
阅读次数:
103