POJ 2299 线段树求逆序数
2016-03-15 13:03
344 查看
点击打开链接
题意:将一个无序的数列排列成有序的数列,问最少需要多少步可以完成
思路:赤裸裸的求逆序数嘛~~,还是最简单的那种,线段树轻松过之,可能姿势不好,时间蛮长的
之前有一道求逆序数的HDU的题目,那片文章已经介绍过原理,有兴趣的可以看看HDU1394
题意:将一个无序的数列排列成有序的数列,问最少需要多少步可以完成
思路:赤裸裸的求逆序数嘛~~,还是最简单的那种,线段树轻松过之,可能姿势不好,时间蛮长的
之前有一道求逆序数的HDU的题目,那片文章已经介绍过原理,有兴趣的可以看看HDU1394
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int maxn=500010; const int inf=0x3f3f3f3f; ll num[maxn*4]; int A1[maxn],A[maxn]; void update(int pos,int le,int ri,int node){ if(le==ri){ num[node]++; return ; } int t=(le+ri)>>1; if(pos<=t) update(pos,le,t,node<<1); else update(pos,t+1,ri,node<<1|1); num[node]=num[node<<1]+num[node<<1|1]; } ll query(int l,int r,int le,int ri,int node){ if(l<=le&&ri<=r){ return num[node]; } int t=(le+ri)>>1; ll ans=0; if(l<=t) ans+=query(l,r,le,t,node<<1); if(r>t) ans+=query(l,r,t+1,ri,node<<1|1); return ans; } int main(){ int n; while(scanf("%d",&n)!=-1){ if(n==0) break; memset(num,0,sizeof(num)); for(int i=1;i<=n;i++){ scanf("%d",&A1[i]); A[i]=A1[i]; } sort(A+1,A+1+n); ll ans=0; for(int i=1;i<=n;i++){ int t=lower_bound(A+1,A+1+n,A1[i])-A; // cout<<"adad"<<t<<endl; ans+=query(t,n,1,n,1); update(t,1,n,1); } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 有关Intel主板驱动静默安装的一个坑
- 二分题目
- 并查集
- android 微博 微信登录
- Spring事务异常回滚,捕获异常不抛出就不会回滚
- 130. Surrounded Regions
- MAC OSX 10.10 下启用自带的Apache的rewrite模块
- 新项目遇到的时间标签问题
- 树状数组-线段树
- .net创建和调用WebService
- Android与HTML+JS交互入门
- 2-SAT
- vc6转2010
- 数组初始化的三种方式
- 怎样用指针指向二维数组
- 字符串暴力
- python之pandas使用:数据的选择
- Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作
- 位运算(含应用)
- 培训日报3.14(mysql,guava,穿山甲等)