【模板】逆序对(树状数组)
2018-03-15 10:17
246 查看
逆序对在编程中比较常见,最普通的O(n ^ 2)算法很短,但是太慢了,往往不满足我们的要求。一种高级的O(nlogn)的算法是使用归并排序,在归并排序执行过程中解决问题,时间是短,但是代码量太大了。现在,我们有一种算法,时间短,代码量也少,很好记,就是用树状数组来实现。int n, c[MAXN], number[MAXN];
struct Node { int val, num; } a[MAXN];
bool cmp(Node a, Node b) { return a.val > b.val; }
int lowbit(int x) { return x & (-x); }
void add(int x)
{
for (int i = x;i <= n;i += lowbit(i)) c[i]++;
}
int query(int x)
{
int ans = 0;
for (int i = x;i > 0;i -= lowbit(i)) ans += c[i];
return ans;
}
int reverse_order_pair()
{
int ans = 0, temp = -1, tot = 0;
stable_sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
if (a[i].val != temp)
{
tot++;
temp = a[i].val;
}
number[a[i].num] = tot;
}
for (int i = 1; i <= n; i++)
{
add(number[i]);
ans += query(number[i] - 1);
}
return ans;
}
revers_order_pair是求解逆序对的函数,compare是为了使用sort,add和query应该都看得懂,毕竟是树状数组经典操作。实现过程就画个图就解决了。
struct Node { int val, num; } a[MAXN];
bool cmp(Node a, Node b) { return a.val > b.val; }
int lowbit(int x) { return x & (-x); }
void add(int x)
{
for (int i = x;i <= n;i += lowbit(i)) c[i]++;
}
int query(int x)
{
int ans = 0;
for (int i = x;i > 0;i -= lowbit(i)) ans += c[i];
return ans;
}
int reverse_order_pair()
{
int ans = 0, temp = -1, tot = 0;
stable_sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
if (a[i].val != temp)
{
tot++;
temp = a[i].val;
}
number[a[i].num] = tot;
}
for (int i = 1; i <= n; i++)
{
add(number[i]);
ans += query(number[i] - 1);
}
return ans;
}
revers_order_pair是求解逆序对的函数,compare是为了使用sort,add和query应该都看得懂,毕竟是树状数组经典操作。实现过程就画个图就解决了。
相关文章推荐
- 求逆序对模板题(完善模板:树状数组或归并排序)
- 树状数组求逆序和模板
- 树状数组模板3——求逆序对
- poj2299Ultra-QuickSort【树状数组求逆序数、离散化】、【归并排序模板】
- 【模板】树状数组求逆序对
- hdu5792 多校5 World is Exploding【树状数组求逆序数】
- 求逆序对[树状数组] jdoj
- Minimum Inversion Number 求逆序树 线段树||树状数组
- Ultra-QuickSort (poj 2299 归并排序 || 树状数组 求逆序对)
- 【HDU5892 2016 ACM ICPC Asia Regional Shenyang Online A】【二维树状数组模板 区间修改】nn矩阵内子矩阵中各怪兽数量的奇偶性.cpp
- 树状数组(二叉索引树 BIT Fenwick树) *【一维基础模板】(查询区间和+修改更新)
- 树状数组求逆序对
- Bzoj 2141: 排队 分块,逆序对,树状数组
- 【模板】树状数组 单点修改,区间求和 (模板题:洛谷P3374树状数组1)
- HDU2838 Cow Sorting【树状数组】【逆序数】
- 树状数组 (模板)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- 整理的树状数组模板 & 敌兵布阵 HDU - 1166
- POJ2299 树状数组求逆序数
- 火柴排队(树状数组求逆序对)