POJ 2299 快速求逆序数
2013-11-01 20:45
302 查看
逆序数的本质就是看前面有几个数比你大,那么设置一个数组,每次插入一个数值,记录插入的数字个数,每次统计从1到插入的这个数之间的数字个数,这个数字是顺序数,用此时插入的数的总个数一减就是现在这个数列的逆序数。
统计从1到n的数的个数使用树状数组就可以了。
该死的,一开始没用64位整数,挂了。后来改成long long的时候又没有修改printf,修改成printf("%I64d",ans)就过掉了
统计从1到n的数的个数使用树状数组就可以了。
该死的,一开始没用64位整数,挂了。后来改成long long的时候又没有修改printf,修改成printf("%I64d",ans)就过掉了
#include<stdio.h> #include<algorithm> #include<utility> #include<string.h> using namespace std; typedef long long ll; typedef pair<ll,ll> P; P num[600000]; ll b[600000];// discrete as origin sequence ll bit[600000]; ll n; ll sum(ll i) { ll s=0; while(i>0) { s+=bit[i]; i-=i&(-i); } return s; } void add(ll i,ll x) { while(i<=n) { bit[i]+=x; i+=i&(-i); } } int main() { while(scanf("%d",&n)&&n!=0) { memset(bit,0,sizeof(bit)); for(ll i=1;i<=n;i++) { ll tn; scanf("%d",&tn); num[i]=P(tn,i); } sort(num+1,num+1+n); for(ll i=1;i<=n;i++) b[num[i].second]=i; ll ans=0; for(ll i=1;i<=n;i++) { add(b[i],1); ans+=(i-sum(b[i])); } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- Machine Learning —— By Andrew Ng(机器学习 听后自己做的笔记 记录重点内容)
- liferay get permissionChecker in service
- Linux c字符串拷贝函数
- 黑马程序员_正则表达式
- flex的air转化为exe文件
- (原)OC思考
- Windows Server 2012 为什么没有“磁盘清理”选项了?
- 二叉树遍历算法
- 健按摩是采用按摩胸部、乳房的办法来增大乳房,方便有效。具体方法
- android 自适应 多屏幕支持
- 程序员--桃花庵
- poj2186我的第一个强连通题目
- 实验5 函数验证哥德巴赫猜想
- uva 10558 A Brief Gerrymander (dp记忆化搜索)
- (原)C#连接ACCESS2007
- IBMRAD最新版9.0可以下载了
- (原)HTML页面基本格式
- POJ P2524 Ubiquitous Religions
- 第十周上机实践-----判断是不是素数
- (原)对冲突域和广播域的分割