题目:HDU1394 Minimum Inversion Number

若abcde...的逆序数为k,那么bcde...a的逆序数是多少?我们假设abcde...中小于a的个数为t , 那么大于a的个数就是n-t-1,当把a移动最右位时,原来比a

大的现在都成了a的逆序对,即逆序数增加n-t-1,但是原来比a小的构成逆序对的数,现在都变成了顺序,因此逆序对减少t ,所以新序列的逆序数为 k +=

n - t - t -1,即k += n-1-2 * t , 于是我们只要不断移位(n次),然后更新最小值就可以了

#include <stdio.h>
#define maxn 55555
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[maxn<<2];
int x[maxn];
int min(int a,int b)
{
return a<b? a:b;
}
void PushUP(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Build(int l,int r,int rt)
{
sum[rt]=0;
if(l==r)
return;
int m=(l+r)>>1;
Build(lson);
Build(rson);
}
void Update(int p,int l,int r,int rt)
{
if(l==r)
{
sum[rt]++;
return;
}
int m=(l+r)>>1;
if(p<=m)
Update(p,lson);
else
Update(p,rson);
PushUP(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
return sum[rt];
int m=(l+r)>>1;
int ret=0;
if(L<=m)      ret+=Query(L,R,lson);
if(R>m)       ret+=Query(L,R,rson);
return ret;
}
int main()
{
int n,i;
while(~scanf("%d",&n))
{
Build(0,n-1,1);
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&x[i]);
sum+=Query(x[i],n-1,0,n-1,1);
Update(x[i],0,n-1,1);
}
int ret=sum;
for(i=0;i<n;i++)
{
sum+=n-x[i]-x[i]-1;
ret=min(ret,sum);
}
printf("%d\n",ret);
}
return 0;
}

线段树求逆序数(单点更新)相关推荐

  1. hdu5775 Bubble Sort(线段树求逆序数)

    题目点我点我点我 题目大意:按照题目的冒泡排序求每个数在排序过程中到达最右边位置与最左边位置之差. 解题思路:实际可变成max(左边比它大的数的个数,右边比它小的数的个数),用线段树解决,先求出每个数 ...

  2. 线段树求区间和(单点更新)

    题目1:敌兵布阵  线段树的主要操作:(1)建立线段树(Build)          (2)更新区间值 (Update)           (3)查询区间(Query) 写法一: #include ...

  3. 线段树求逆序对(hdu1394Minimum Inversion Number)

    说实话,线段树求逆序对我理解了半天诶,不知是否有人像我一样. 对于每个数来说,只有和已经出现过的.比它大的数才能形成逆序对,那么在给定的数列中,每给一个数就向前找比它大的数. 样例:10 1 3 6 ...

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

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

  5. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

  6. 吉首大学2019年程序设计竞赛(重现赛) 干物妹小埋(线段树求最长上升子序列)

    链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  7. hdu 1394(树状数组求逆序数)

    解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...

  8. 离散化+树状数组求逆序数

    题目:http://poj.org/problem?id=2299 离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0--- 999999999:显然 ...

  9. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

最新文章

  1. matlab 用fplot和plot作出函数图像
  2. JS调用WebService 无刷新获得在线消息
  3. oracle 表空间-用户-授权-表创建
  4. Python装饰器学习笔记 1
  5. 真实,让文学回到原点:关于非虚构写作的思考
  6. 【bzoj2132】圈地计划 网络流最小割
  7. LsLoader——通用移动端Web App离线化方案
  8. A-Deeper-Understanding-of-Spark-Internals(Spark内核深入理解)
  9. Android视频开发基础
  10. Java反射在Main方法的中的而应用
  11. 【Java NIO的深入研究5】字符集Charset
  12. mysql服务器系统优化_mysql服务器系统优化
  13. 教你如何把书本上的字快速弄到电脑上
  14. 摆脱学校WiFi的设备数限制——无线桥接
  15. 读取图片java_用java读取图片的三种方式
  16. Linux服务器期末复习总结
  17. 应用程序无法正常启动(0xc000007b) 请单击确定关闭应用程序
  18. 第一款让我付费使用的流程图软件EDraw Max亿图图示
  19. 独家 | 火灾之后,我们能够利用大数据做些什么?
  20. 国科大 - 算法中的最优化方法(林姝)考试复习

热门文章

  1. RocketMQ的架构
  2. 关于Spring容器管理Bean的过程以及加载模式
  3. canal数据同步(开启binlog功能)
  4. 动态代理源码分析,实现自己的动态代理
  5. 解决yarn全局安装模块后但仍提示无法找到命令的问题
  6. Java中的内存划分
  7. RabbitMQ原理讲解
  8. SpringBoot高级-消息-RabbitMQ安装测试
  9. Spring--SPeL
  10. ReentrantLock源码