T4: 求逆序对A[I]为前缀和推导 (A[J]-A[I])/(J-I)>=MA[j]-A[I]>=M(J-I)A[J]-M*J>=A[I]-M*I设B[]=A[]-M*();B[J]>=B[I]也就是求逆序对;求逆序对的方法主要有两种: 归并排序; 树状数组;这里两种方法都学习一下:1.之前对于树...
分类:
其他好文 时间:
2014-09-09 11:56:48
阅读次数:
262
T4: 用树状数组求逆序对A[I]为前缀和推导 (A[J]-A[I])/(J-I)>=MA[j]-A[I]>=M(J-I)A[J]-M*J>=A[I]-M*IB[J]>=B[I]之后就是求逆序对的事情了然后这里学一下用树状数组的方法原理是:树状数组是用来求区间和的是吧就是按权值的区间统计那么可以BI...
分类:
其他好文 时间:
2014-09-07 12:09:35
阅读次数:
251
#include
#include
#include
using namespace std;
const int N = 101000;
int a[N];
struct Node
{
int l,r,num;
};
Node tree[4*N];
void build(int l,int r,int o)
{
tree[o].l=l,tree[o].r=r;
t...
分类:
其他好文 时间:
2014-08-19 11:03:14
阅读次数:
222
基本思想和线段树求解逆序数是一样的,前一篇《求逆序对 线段树版》也介绍过,先对输入数组离散,数组里的元素都不相同可以直接hash,存在相同的数话可以采用二分。
离散化后对于每个f[i],找到f[i]+1~ n中的个数,也就是到i这个位置,一共有多少比f[i]大的数,统计之后在将f[i]的位置上的数量加1。
这样一来统计的就是类似a[i]~n的和,可以想象成 把树状数组反过来统计,即统计的时候加...
分类:
其他好文 时间:
2014-08-18 16:30:22
阅读次数:
169
一个序列a1,a2,a3...aN,求出满足:ai > aj 且 i
一个最容易想到的方法就是枚举所有的i,j看看是否满足,显然是O(n^2)的复杂度。不够好。
可以这样考虑,开一个数组保存这n个数出现的位置和对应的次数,这个数组要开到a数组里最大的那个数MAX,也就是hash,初始状态数组里没有元素,每个数对应的个数都是0.
如果考虑第i个数,找到比它大的所有的数 的个数,查找的范围即 ...
分类:
其他好文 时间:
2014-08-16 23:52:31
阅读次数:
425
题解:首先是很基础的树状数组求逆序对,然后对于每一个第一个数往后移动,对于逆序数的贡献是n-a[i]-1-a[i]。枚举然后求最小值即可。#include #include #include using namespace std;int n,c[5001],x,a[5001];int add(in...
分类:
其他好文 时间:
2014-08-13 17:46:06
阅读次数:
255
题意:求逆序对解题思路:1)树状数组 + 离散化解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月05日 星期二 12时05分09秒 4 5 #include 6 #include 7 #in....
分类:
其他好文 时间:
2014-08-12 08:57:23
阅读次数:
182
1001 题意:求逆序对,然后交换k次相邻的两个数,使得剩下的逆序对最少。分析:题目用到的结论是:数组中存在一对逆序对,那么可以通过交换相邻两个数使得逆序对减少1,交换k次,可以最多减少k个。嘉定ai>aj,i aj,那么ak,aj构成逆序对,交换后逆序对减少1;#12:ak=ai那么ak,aj构....
分类:
其他好文 时间:
2014-08-10 01:28:40
阅读次数:
292
2-4 逆序对 设A[1...n]是一个包含n个不同数的数组,如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。 a)列出数组的5个逆序对 b)如果数组的元素取自集合{1,2,...,n}, 那么, 怎样的数组含有最多的逆序对?它包含多少个逆序对? c)插入排...
分类:
其他好文 时间:
2014-08-08 01:31:15
阅读次数:
271