博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2299(树状数组+离散化)
阅读量:4338 次
发布时间:2019-06-07

本文共 1454 字,大约阅读时间需要 4 分钟。

这道题题意很简单,就是求逆序数。用暴力的方法是显然会超时的。这里考虑采用树状数组。

采用树状数组话遇到的问题就是需要999,999,999个空间来存放数据,这显然是不可行的。考虑到输入数据最多只有500,000个,那么可以采用离散化的方法来先将输入数据进行映射到较小的空间上,然后再用一般的树状数组操作统计即可。

#include 
#include
using namespace std;const int MAX = 500005;struct Node{ int v; int order;}node[MAX];int num[MAX];int tree[MAX];int sum(int idx){ int ans = 0; while (idx > 0){ ans += tree[idx]; idx -= idx&-idx; } return ans;}void update(int idx, int val){ while (idx <= MAX) { tree[idx] += val; idx += idx&-idx; }}bool cmp(Node n1, Node n2){ return n1.v < n2.v;}int main(){ int n; while (scanf("%d", &n) != EOF && n){ memset(tree, 0, sizeof(tree)); memset(node, 0, sizeof(node)); //离散化开始 for (int i = 1; i <= n; i++){ scanf("%d", node + i); node[i].order = i; } sort(node + 1, node + n + 1, cmp); for (int i = 1; i <= n; i++){ num[node[i].order] = i; } //离散化完成,以下为一般的树状数组操作 long long inverseNo = 0; for (int i = 1; i <= n; i++){ inverseNo += (i - 1) - sum(num[i]); update(num[i], 1); } printf("%lld\n", inverseNo); } return 0;}

 参考:

http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html

https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/

转载于:https://www.cnblogs.com/caiminfeng/p/4904117.html

你可能感兴趣的文章
Wix制作安装包
查看>>
二叉堆(小到大)-数据结构-JavaScript版
查看>>
网络战争
查看>>
sort-快速排序
查看>>
Treeview SelectedNodeChanged event not firing
查看>>
mysql 日志管理
查看>>
VMware WorkStation安装时提示The MSI failed
查看>>
JavaScript, AJAX树形控件大全(all kinds of TreeView Controls by JavaScript, AJAX)[转载]
查看>>
[转]MSDTC on server '''' is unavailable. 的解决办法
查看>>
SpringMVC注解
查看>>
Spring 依赖注入
查看>>
数据结构——二叉树树的遍历理论与实现
查看>>
delphi AfterScrol
查看>>
软件外包,IT咨询和转型
查看>>
[MySQL] InnoDB三大特性之 - 插入缓冲
查看>>
Sphinx安装配置应用
查看>>
dns 域名解析
查看>>
nohup top & 问题: top: failed tty get
查看>>
详解ORACLE数据库的分区表
查看>>
Windows7下安装SQLServer2005过程详解
查看>>