http://acm.hdu.edu.cn/showproblem.php?pid=1394

线段树入门题,每次读入一个数,就寻找在树中比它大的值的个数,然后更新树,把个数相加就是逆序数,每移动一个数,相当于当前逆序数加上比首元素大的数的数量,减去比首元素小的数的数量。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; struct segtree
{
int left,right,sum;
}tree[];
int n,a[]; void build(int pos,int l,int r)
{
tree[pos].left = l;
tree[pos].right = r;
tree[pos].sum = ;
if(l < r)
{
int mid = (l+r)/;
build(pos*,l,mid);
build(pos*+,mid+,r);
}
} int getsum(int pos,int l,int r)
{
if(tree[pos].left == l && tree[pos].right == r) return tree[pos].sum;
int mid = (tree[pos].left+tree[pos].right)/;
if(r <= mid) return getsum(pos*,l,r);
if(l > mid) return getsum(pos*+,l,r);
return getsum(pos*,l,mid)+getsum(pos*+,mid+,r);
} void update(int pos,int num)
{
tree[pos].sum++;
if(tree[pos].left == tree[pos].right) return;
int mid = (tree[pos].left+tree[pos].right)/;
if(num <= mid) update(pos*,num);
else update(pos*+,num);
} int main()
{
while(~scanf("%d",&n))
{
int ans = ;
build(,,n-);
for(int i = ;i < n;i++)
{
scanf("%d",&a[i]);
ans += getsum(,a[i],n-);
update(,a[i]);
}
int temp = ans;
for(int i = ;i < n-;i++)
{
temp += n--a[i]-a[i];
ans = min(temp,ans);
}
printf("%d\n",ans);
}
return ;
}

HDU_1394_线段树的更多相关文章

  1. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  5. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  6. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  7. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. vue-perview插件的使用方法

    先给连接: https://github.com/LS1231/vue-preview   这是插件的文档 从文档中可以看出该插件已经值支持vue2.5以上了 安装: 引用 examples 注意: ...

  2. 小小知识点(二十三)circularly symmetric complex zero-mean white Gaussian noise(循环对称复高斯噪声)

    数学定义 http://en.wikipedia.org/wiki/Complex_normal_distribution 通信中的定义 在通信里,复基带等效系统的噪声是复高斯噪声,其分布就是circ ...

  3. SSM三大框架整合思路

    1.Dao层: Mybatis的配置文件:SqlMapConfig.xml 不需要配置任何内容,需要有文件头.文件必须存在. applicationContext-dao.xml: mybatis整合 ...

  4. 查找2-n之间素数的个数

    题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n ...

  5. Spring中PropertiesLoaderUtils应用

    FileSystemResource fileSystemResource =new FileSystemResource("D:/home/conf/mail.properties&quo ...

  6. 【一起学源码-微服务】Eureka+Ribbon+Feign阶段性总结

    前言 想说的话 这里已经梳理完Eureka.Ribbon.Feign三大组件的基本原理了,今天做一个总结,里面会有一个比较详细的调用关系流程图. 说明 原创不易,如若转载 请标明来源! 博客地址:一枝 ...

  7. 前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度

    本文同步自 JSCON简时空 - 前端Tips 专栏#4,点击阅读 视频讲解 视频地址 文字讲解 如果去测试代码运行的时长,你会选择哪个时间函数? 一般第一时间想到的函数是 Date.now 或 Da ...

  8. 【C_Language】---最全面的C指针总结,初级程序员必备

    好久没写博客了,重新学习C语言了的基础课程,发现很多东西都忘记的差不多了,闲来无事,总结一下关于指针的知识,希望能帮到像我一样的菜鸟们: 指针,众所周知是C语言的精华所在,不懂指针的话,你就不要说你学 ...

  9. 线性基 - 寻找异或第K大

    XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A ...

  10. playbooks框架部署远程主机

    进入到ansible和python环境 进入python3.6虚拟环境 #su - deploy #source .py3-a2.5-env/bin/activate 加载ansible 2.5版本 ...