POJ 2299 Ultra-QuickSort 线段树
题意:求冒泡排序的交换次数,即求逆序数,即求对于每个数前面有多少个数比他大,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 线段树的更多相关文章
- POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树
题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...
- HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)
做这道题之前,建议先做POJ 1151 Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissio ...
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- POJ 2991 Crane(线段树+计算几何)
POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...
随机推荐
- Jquery获取offsetHeight
纯javascript: window.document.getElementById('MainColumn').offsetHeight jquery: $('#id').get(0).offse ...
- 《C编译器剖析》后记
这本书的序言.后记写的都让我很有感触!mark: 后 记 总有曲终人散时,不知不觉我们已经完成了对UCC 编译器的剖析,一路走来,最深的体会仍然是“纸上得来终觉浅,绝知此事要躬行”.按这个道理,理解U ...
- 字符串作为map的key
#include <map> #include <string> struct cmp_str{ bool operator()(char const* a, char con ...
- Zookeeper学习之:paxos算法
paxos算法的重要性众所周知,它给如今的分布式一致性提供了迄今为止最好的解决方案.无论是Lamport自己的论文描述,还是网上的诸多资料,对paxos的描述都是及其简洁的,给人的感觉是paxos看似 ...
- 使用Gitblit 在windows 上部署你的Git Server
Gitblit: 在windows 上部署你的Git Server 前言 之前在dudu的文章里看到过用bonobogit 部署在 IIS 7.5 上的Window 平台的git 服务器.学着部署使用 ...
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- Mac下Jenkins+SVN+Xcode构建持续
1 安装Jenkins Jenkins是基于Java开发的一种持续集成工具.所以呢,要使用Jenkins必须使用先安装JDK. JDK安装 JDK 下载地址 jdk 1.8.png 安装JDK的过程略 ...
- QEMU 中的QOM分析
QOM (QEMU Object Model) 类对象的意义: 1:每个类型在系统中都只有且只有一个类对象 2:当系统中的某个类型的实例对象都被销毁了,那么系统就会销毁该类对象了 3:类对象的作用:负 ...
- Oracle的表锁死以及解锁
Oracle的表锁死以及解锁 oracle 查看锁死的表,锁死的进程. select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_na ...
- icomoon图标的使用
这里的图标可以自己定义 网址:https://icomoon.io/app/#/select/ 定义完后,自己下载下来 引用: <link href="css/style.css ...