首页 > 代码库 > POJ 2299 Ultra-QuickSort (离散化+树状数组)
POJ 2299 Ultra-QuickSort (离散化+树状数组)
题目链接:POJ 2299 Ultra-QuickSort
求一串序列相邻连个元素交换多少后,是一串上升的序列。
思路:求该串序列的逆序数,数据比较大,要离散化。
AC代码:
#include<stdio.h> #include<string.h> #include<set> #include<map> #include<algorithm> #define ll __int64 using namespace std; const ll maxn=500010; ll n,c[maxn],a[maxn]; struct node { ll val,id; }; struct node p[maxn]; ll lowbit(ll x) { return x&(-x); } void update(ll x,ll i) { while(x<=n) { c[x]+=i; x+=lowbit(x); } } ll sum(ll x) { ll ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } bool cmp(node a,node b) { return a.val<b.val; } int main() { ll i; while(scanf("%I64d",&n)!=EOF,n) { memset(a,0,sizeof a); memset(c,0,sizeof c); for(i=1;i<=n;i++) { scanf("%I64d",&p[i].val); p[i].id=i; } sort(p+1,p+n+1,cmp); for(i=1;i<=n;i++)//离散化 a[p[i].id]=i; ll temp,ans=0; for(i=1;i<=n;i++) { update(a[i],1); temp=sum(a[i]); ans+=i-temp; } printf("%I64d\n",ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。