<题目链接>

题意描述:

给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找出其中最小的一个输出!

解题分析:

先利用线段树求出初始序列的逆序数,这里有一个非常巧妙的地方,由于比a[i]大的数是离散且连续的,所以可以用线段树来实现(与线段树节点的区间特性符合)。

#include <bits/stdc++.h>
using namespace std; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
const int N = 5e3+;
int n;
int tr[N<<],arr[N];
inline void Pushup(int rt){ tr[rt]=tr[rt<<]+tr[rt<<|]; }
void update(int rt,int l,int r,int loc){
if(l==r){ tr[rt]+=;return; } //将这个点插入线段树
int mid=l+r>>;
if(loc<=mid)update(Lson,loc);
if(loc>mid)update(Rson,loc);
Pushup(rt);
}
int query(int rt,int l,int r,int L,int R){
if(L<=l && r<=R){ return tr[rt]; }
int mid=l+r>>;
int ans=;
if(L<=mid)ans+=query(Lson,L,R);
if(R>mid)ans+=query(Rson,L,R);
return ans;
}
int main(){
while(~scanf("%d",&n)){
memset(tr,,sizeof(tr));
int sum=;
for(int i=;i<=n;i++){
scanf("%d",&arr[i]);
sum+=query(,,n-,arr[i]+,n-); //逆序数之前插入的,比这个数要大的数的个数
update(,,n-,arr[i]);
}
//此时ans为原序列的逆序数
int ans=sum;
for(int i=;i<=n-;i++){ //只用重新算n-1次就行,因为第n次与原序列相同
sum+=(n--*arr[i]); //注意这里求逆序数,必须是在前一个序列的基础上求
ans=min(ans,sum);
}
printf("%d\n",ans);
}
}

hdu 1394 (线段树求逆序数)的更多相关文章

  1. hdu 1394 线段树计算逆序数

    线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...

  2. hdu 1394(线段树) 最小逆序数

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 给出一列数组,数组里的数都是从0到n-1的,在依次把第一个数放到最后一位的过程中求最小的逆序数 线段树的应 ...

  3. HDU 1394 线段树求逆序对

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  4. HDU_1394_Minimum Inversion Number_线段树求逆序数

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  5. 线段树求逆序数方法 HDU1394&amp;&amp;POJ2299

    为什么线段树能够求逆序数? 给一个简单的序列 9 5 3 他的逆序数是3 首先要求一个逆序数有两种方式:能够从头開始往后找比当前元素小的值,也能够从后往前找比当前元素大的值,有几个逆序数就是几. 线段 ...

  6. hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...

  7. <Sicily>Inversion Number(线段树求逆序数)

    一.题目描述 There is a permutation P with n integers from 1 to n. You have to calculate its inversion num ...

  8. HDU-1394 Minimum Inversion Number(线段树求逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...

  9. HDU - 1394 Minimum Inversion Number (线段树求逆序数)

    Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs ( ...

随机推荐

  1. CF1066D Boxes Packing

    传送门 这题为什么要用二分呢?/huaji 首先可以\(O(n)\)预处理出从某个物品\(i\)开始放,只放一个盒子,能放的最后物品的位置\(j\),只要用两个指针维护左右端点,每次移动一下左端点同时 ...

  2. python正则表达式二[转]

    原文:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一 ...

  3. SpringMVC集成Redis

    (1)添加pom依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId ...

  4. Hacker需要掌握的基础

    编译语言:1.C语言能力要求:精通选用教材:<C Primer Plus 中文版(第5版)>其他教材:<标准C程序设计(第3版)><C语言入门经典(原书第3版)>补 ...

  5. css 悬浮框

    <style>    .xfk {        display: block;        position: fixed;        top: 150px;        lef ...

  6. vim使用案例

    1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录: 2. 进入 vitest 这个目录当中: 3. 将 /etc/man.config 复制到本目录底下(或由上述的连结下载 man. ...

  7. Java用四种方法实现阶乘n! (factorial)

    1. 引言 实现阶乘的方法很多,这边介绍四种方法,分别是递归,尾递归,循环和BigDecimal. 2. 代码 public class Test { public static void main( ...

  8. GBDT学习

    白话GBDT: https://blog.csdn.net/qq_26598445/article/details/80853873 优点: 预测精度高 适合低维数据 能处理非线性数据,该版本GBDT ...

  9. 队列queue 代码

    import queue q=queue.Queue(3) #队列:先进先出 q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print(q.ge ...

  10. VirtualBox虚拟机安装Mac OS 10.12

    注:本文作者  (QQ:85805214) 本博主只是转载发布而已. VMware 安装Mac OS 方法 由于Virtual Box拷贝文件比较麻烦,有时候经常出现拷贝失败的情况,故使用VMware ...