POJ2299 树状数组求逆序对
来源:互联网 发布:世界语言翻译软件 编辑:程序博客网 时间:2024/06/10 19:42
给定一个数组,求全部逆序对数目。
如果动态修改,如何求呢?
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;const int maxn= 500005;int aa[maxn];//离散化后的数组int c[maxn]; //树状数组int n;struct Node{ int v; int order;}a[maxn];bool cmp(Node a, Node b){ return a.v < b.v;}int lowbit(int k){ return k&(-k); //基本的lowbit函数 }void update(int t, int value){ //即一开始都为0,一个个往上加(+1), int i; for (i = t; i <= n; i += lowbit(i)) c[i] += value; }int getsum(int t){ //即就是求和函数,求前面和多少就是小于它的个数 int i, sum = 0; for (i = t; i >= 1; i -= lowbit(i)) sum += c[i]; return sum;}int main(){ int i; while (scanf("%d", &n), n) { for (i = 1; i <= n; i++) //离散化 { scanf("%d", &a[i].v); a[i].order = i; } sort(a + 1, a + n + 1,cmp);//从1到n排序,cmp容易忘 memset(c, 0, sizeof(c)); for (i = 1; i <= n; i++) aa[a[i].order] = i; __int64 ans = 0; for (i = 1; i <= n; i++) { update(aa[i], 1); ans += i - getsum(aa[i]); //减去小于的数即为大于的数即为逆序数 } printf("%I64d\n", ans); } return 0;}
阅读全文
0 0
- POJ2299 树状数组求逆序对
- 【poj2299】树状数组求逆序对 Ultra-QuickSort
- poj2299 Ultra-QuickSort--求逆序对+树状数组
- POJ2299 树状数组求逆序数
- 树状数组求逆序数poj2299
- poj2299(离散化+树状数组求逆序)
- POJ2299 树状数组求逆序数
- POJ2299 树状数组求逆序数
- poj2299 树状数组快速求逆序数
- POJ2299 树状数组求逆序数
- POJ2299 求逆序对
- 离散化+树状数组 求逆序数POJ2299
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- POJ2299:Ultra-QuickSort(树状数组求逆序数)
- 简单基础树状数组求逆序数 POJ2299
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- Unity 简单易用的插件汇总
- x264官方学习文档(2)——英文资料,极具参考价值
- 技术相关博客收藏
- 选择排序和冒泡排序
- 【Android实测】分析apk过程记录(一)
- POJ2299 树状数组求逆序对
- 快速搭建php rbac后台
- 欢迎使用CSDN-markdown编辑器
- x264官方学习文档(3)——英文资料,极具参考价值
- UIWebView 的坑点
- string subtraction
- 感兴趣的博客地址临时记录
- Session简单介绍
- 再见Win7----记录Win7系统的安装