hdu 1394 线段树计算逆序数
线段树计算逆序数的原理:
用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可。
这个题还有一个特点就是,题目给的是0至n-1的全排列,也就是说每个数都不同。那么abcde的逆序数与bcdea的逆序数就很明了了。
假设比a小的数有t个,那么比a大的数有n-t-1个,那么abcde转换至bcdea的逆序数就增加了n-t-1,减少了t
不需要build函数建树,因为初始状态没有数插入,直接menset就可以了
#include <bits/stdc++.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std; const int MAXN = 5008;
int cnt[MAXN<<2]; int query(int L, int R, int l, int r, int rt)
{
if(L <= l && r <= R) return cnt[rt];
int ret = 0;
int m = (l + r) >> 1;
if(L <= m) ret += query(L, R, lson);
if(R > m) ret += query(L, R, rson);
return ret;
} void updata(int p, int l, int r, int rt)
{
if(l == r)
{
cnt[rt]++;
return;
}
int m = (l + r) >> 1;
if(p <= m) updata(p, lson);
else updata(p, rson);
cnt[rt] = cnt[rt<<1] + cnt[rt<<1|1];
} int a[MAXN]; int main()
{
// freopen("in.txt", "r", stdin);
int n;
while(~scanf("%d", &n))
{
memset(cnt, 0, sizeof(cnt));
int sum = 0;
for(int i=0; i<n; i++)
{
scanf("%d", &a[i]);
sum += query(a[i]+1, n-1, 1, n, 1);
updata(a[i], 1, n, 1);
}
int ans = sum;
for(int i=0; i<n; i++)
{
sum += n - 2*a[i] - 1;
ans = min(ans, sum);
}
printf("%d\n", ans);
}
return 0;
}
hdu 1394 线段树计算逆序数的更多相关文章
- hdu 1394(线段树) 最小逆序数
http://acm.hdu.edu.cn/showproblem.php?pid=1394 给出一列数组,数组里的数都是从0到n-1的,在依次把第一个数放到最后一位的过程中求最小的逆序数 线段树的应 ...
- hdu 1394 (线段树求逆序数)
<题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...
- HDU 1394 线段树求逆序对
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 线段树-最小逆序数hdu1394
title: 线段树-最小逆序数 date: 2018-10-12 17:19:16 tags: acm 算法 刷题 categories: ACM-线段树 概述 这是一道简单的线段树的题,,,当然还 ...
- HDU_1394_Minimum Inversion Number_线段树求逆序数
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU - 1394 Minimum Inversion Number (线段树求逆序数)
Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs ( ...
- [HDU] 1394 Minimum Inversion Number [线段树求逆序数]
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- hdu 1394 Minimum Inversion Number 【线段树求逆序数】
之前写过树状数组的,再用线段树写一下--- #include<cstdio> #include<cstring> #include<iostream> #inclu ...
- HDU - 1394 Minimum Inversion Number(线段树求逆序数---点修改)
题意:给定一个序列,求分别将前m个数移到序列最后所得到的序列中,最小的逆序数. 分析:m范围为1~n,可得n个序列,求n个序列中最小的逆序数. 1.将序列从头到尾扫一遍,用query求每个数字之前有多 ...
随机推荐
- 【转载】一次「Too many open files」故障
一次「Too many open files」故障 发表于2015-08-02 昨天,项目的 ElasticSearch 服务挂了,我说的挂可不是进程没了,因为有 Supervisor 保护,而是服务 ...
- 联想INTEL X86台式机 用光驱启动 usb光驱启动
联想INTEL X86台式机 用光驱启动 usb光驱启动 启动项顺序 都要调整 主要顺序 自动顺序 出错顺序 按下f10 f12
- SSM整合(ForestBlog为例)
SSM整合(ForestBlog为例) 原版本github地址 :https://github.com/saysky/ForestBlog 文中版本地址:https://github.com/Yans ...
- 说明位图,矢量图,像素,分辨率,PPI,DPI?
说明位图,矢量图,像素,分辨率,PPI,DPI? 显示全部 关注者 28 被浏览 7,031 关注问题写回答 邀请回答 添加评论 分享 2 个回答 默认排序 刘凯 21 人赞同了 ...
- CAD中解决打印图纸模糊而且有的字体深浅不一的方法
按圈圈中选择打印样式
- 火币HBAI量化币圈唯一免费量化炒币机器人
量化交易是一种投资方法.以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策略,极大地减少了投资者情绪波动的影响,避免 ...
- MongoDB(8)- 文档删除操作
删除方法 db.collection.deleteOne() 删除单条文档 db.collection.deleteMany() 删除多条文档 db.collection.remove() 删除单条或 ...
- VMware虚拟机CentOS磁盘扩容
版本信息: VMware Workstation 15 Pro 15.5.2 build-15785246, CentOS7 原虚拟机默认20G,安装东西多了,磁盘空间不够用, docker mys ...
- python爬取微信小程序(实战篇)
python爬取微信小程序(实战篇) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90452656 展开 一.背景介绍 近期有需求需要抓 ...
- redis中AOF和RDB的关闭方法
redis中AOF和RDB的关闭方法 问题:当往redis中导入数据时,有时会出现redis server went away的情况: 原因: 导入的数据量太大,而内存不够(即内存1G,但数据有2 ...