poj--2299(树状数组+离散化)
Posted 2018zxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj--2299(树状数组+离散化)相关的知识,希望对你有一定的参考价值。
一、离散化:
https://www.cnblogs.com/2018zxy/p/10104393.html
二、逆序数
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 510000; struct Node{ LL data; int val; }cur[maxn]; LL a[maxn]; bool cmp(Node A,Node B) { return A.data<B.data; } int lowbit(int x) { return x&(-x); } void update(int x) { while(x<maxn-10) { a[x]++; x+=lowbit(x); } } int sum(int x) { int ans=0; while(x>0) { ans+=a[x]; x-=lowbit(x); } return ans; } int main(void) { int n,i; while(~scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { scanf("%lld",&cur[i].data);cur[i].val=i; } sort(cur+1,cur+1+n,cmp); LL ans=0; for(i=1;i<=n;i++) { update(cur[i].val); ans+=i-sum(cur[i].val); } printf("%lld ",ans); } return 0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 510000; struct Node{ LL data; int val; }cur[maxn]; LL a[maxn]; bool cmp(Node A,Node B) { return A.data<B.data; } int lowbit(int x) { return x&(-x); } void update(int x) { while(x<maxn-10) { a[x]++; x+=lowbit(x); } } int sum(int x) { int ans=0; while(x>0) { ans+=a[x]; x-=lowbit(x); } return ans; } int main(void) { int n,i; while(~scanf("%d",&n)&&n) { memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { scanf("%lld",&cur[i].data);cur[i].val=i; } sort(cur+1,cur+1+n,cmp); LL ans=0; for(i=n;i>=1;i--) { ans+=sum(cur[i].val); update(cur[i].val); } printf("%lld ",ans); } return 0; }
以上是关于poj--2299(树状数组+离散化)的主要内容,如果未能解决你的问题,请参考以下文章
Poj 2299 - Ultra-QuickSort 离散化,树状数组,逆序对
poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)
Ultra-QuickSort(树状数组+离散化) POJ - 2299