题目链接

题意:求冒泡排序的交换次数,即求逆序数,即求对于每个数前面有多少个数比他大,n < 500,000,0 ≤ a[i] ≤ 999,999,999。

题解:因为值较大,个数较少,所以我们把每个元素进行映射,比如50,20,30,16,就映射为4,2,3,1这种。先记录下标然后sort排序后用rank数组记录每个数最后所在的位置,rank数组里存的值就是映射后的值,更新加查询即可。减树可以用n或者用N,但是要保证先后关系一致性,不能build用n,查询用N。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstring>
using namespace std;
#define m ((l+r)>>1)
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
#define N 500005
int rank[N];
struct node
{
int id,val;
}num[N];
bool cmp(node n1,node n2)
{
return n1.val<n2.val;
}
struct Tree
{
int l,r,sum;
}tree[N<<];
void build(int rt,int l,int r)
{
tree[rt].l=l;
tree[rt].r=r;
tree[rt].sum=;
if(l==r) return;
build(lson);
build(rson);
}
void update(int rt,int l,int r,int data)
{
tree[rt].sum++;
if(l==r) return;
if(data<=m) update(lson,data);
else update(rson,data);
}
int query(int rt,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr) //查询区间包含当前区间
{
return tree[rt].sum;
}
int sum=;
if(ll<=m) sum+=query(lson,ll,rr);
if(rr>m) sum+=query(rson,ll,rr);
return sum;
}
//这是以前的查询写法 感觉上面的更好
/*
int query(int rt,int l,int r,int ll,int rr)
{
if(llz==l&&rr==r)
{
return tree[rt].sum;
}
if(rr<=m) return query(lson,ll,rr);
else if(ll>m) return query(rson,ll,rr);
else return query(lson,ll,m)+query(rson,m+1,rr);
}
*/
int main()
{
// freopen("cin.txt","r",stdin);
int n;
while(scanf("%d",&n)&&n)
{
for(int i=;i<=n;i++)
{
scanf("%d",&num[i].val);
num[i].id=i;
}
sort(num+,num+n+,cmp);
for(int i=;i<=n;i++) rank[num[i].id]=i;
//id相当于开学的排名12345 rank相当于期末的排名
//那么sum就是经过这学期每个人超越的人的个数的和
//也就是说越靠后的人超越的人的可能性越高
//sort前的id x==num[i].id x和i都表示开学的排名
//sort后的id x==num[i].id x表示开学排名 i表示期末排名
//所以就是rank[x]=i 开学排名为x的人的期末排名为i
//也就是说初始时下标为x的人的现在的下标是i
build(,,N);
long long sum=;
for(int i=;i<=n;i++)
{
int x = rank[i];//元素最后所在的位置
//printf("%d***\n",i);
sum+=query(,,N,x,N);//统计这个数前面有多少个比他大的数
update(,,N,x);//把这个数加到树中
}
printf("%lld\n",sum);
}
return ;
}

POJ 2299 Ultra-QuickSort 线段树的更多相关文章

  1. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  2. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  3. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  4. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  5. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  6. poj 2777 Count Color(线段树)

    题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  7. poj 2828 Buy Tickets (线段树(排队插入后输出序列))

    http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissio ...

  8. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  9. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  10. POJ 2991 Crane(线段树+计算几何)

    POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...

随机推荐

  1. jq方法中 $(window).load() 与 $(document).ready() 的区别

    通过自学进入了前端的行列,只知道在js中,一开头就写一个: window.onload = function(){ //doing sth} 然后所有的乱七八糟的代码全塞里面,大概知道window.o ...

  2. CUDA[2] Hello,World

    Section 0:Hello,World 这次我们亲自尝试一下如何用粗(CU)大(DA)写程序 CUDA最新版本是7.5,然而即使是最新版本也不兼容VS2015 ...推荐使用VS2012 进入VS ...

  3. Linux下使用Hexo搭建github博客

    找到一篇靠谱的博客,备份一下: ---------以下原文------------------ Nodejs安装 因为hexo是基于nodejs的应用,所以要先安装nodejs才可以.我这里以Ubun ...

  4. 用Redis存储session

    0.什么是Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API ---维基百科 1.与其他用户状态保存方 ...

  5. 【先定一个小目标】怎么解决mysql不允许远程连接的错误

    最近使用Navicat for MySQl访问远程mysql数据库,出现报错,显示“1130 - Host'xxx.xxx.xxx.xxx' is not allowed to connect to ...

  6. codevs1403 新三国争霸

    题目描述 Description PP 特别喜欢玩即时战略类游戏,但他觉得那些游戏都有美中不足的地方.灾害总不降临道路,而只降临城市,而且道路不能被占领,没有保护粮草的真实性.于是他就研发了<新 ...

  7. Apache流处理框架对比

    分布式流处理,类似于MapReduce这样的通用计算模型,但是却要求它能够在毫秒级别或者秒级别完成响应.这些系统可以用DAG表示流处理的拓扑. Points of Interest 在比较不同系统是, ...

  8. 信息安全比赛总结(21ic转帖)

    我们的题目是基于这个ZedBoard的__视频流的人脸识别识别的算法采用的是PCA,,但是在后期的调试和实验中发现,,PCA的效果很容易受到环境,比如光照强度,背景,摄像头像素等影响:如果后期的改进的 ...

  9. mkdir创建目录

    mkdir:make directories(创建目录) 创建目录的首要条件:在当前目录或者欲创建目录下,该用户具有写入权限,mkdir详细功能如下: 1.mkdir不接任何参数时,即mkdir di ...

  10. jQuery学习过程问题笔记

    1.  jQuery中,$('selector').click(function(){})和用bind绑定:$('selector').bind('click',function(){})有什么区别? ...