hdu 1394(线段树) 最小逆序数
http://acm.hdu.edu.cn/showproblem.php?pid=1394
给出一列数组,数组里的数都是从0到n-1的,在依次把第一个数放到最后一位的过程中求最小的逆序数
线段树的应用,先建树,输入一个数,查询在在树中比他大的数的个数,然后把这个数更新进树里,再输入数重复操作,类似于进栈一样,先更新进树的数下标肯定是小于后更新的
这样只求到了一个数组的逆序数,还要有依次把第一个数放到最后的得到新数组的比较,这里有一个结论;如果是0到n的排列,那么如果把第一个数放到最后,对于这个数列,逆序数是减少a[i],又增加n-1-a[i]的,就是加上n-1-2*a[i]的,再进行比较取最小的就行
code
#include<cstdio>
using namespace std;
struct point {
int l,r,sum;
};
point tree[*];
int a[];
int n;
void build(int i,int left,int right)
{
tree[i].l=left,tree[i].r=right;
tree[i].sum=;
if (left==right) return ;
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
}
int find(int i,int pos)
{
if (pos<=tree[i].l) return tree[i].sum;
int mid=(tree[i].l+tree[i].r)/;
int a=,b=;
if (pos<=mid)
a=find(i*,pos);
if (n->mid)
b=find(i*+,pos);
return a+b;
}
void update(int i,int pos)
{
if (pos==tree[i].l&&pos==tree[i].r)
{
tree[i].sum=;
return ;
}
int mid=(tree[i].l+tree[i].r)/;
if (pos<=mid)
update(i*,pos);
else
update(i*+,pos);
tree[i].sum=tree[i*].sum+tree[i*+].sum;
}
int main()
{
int ans,i,min;
while (~scanf("%d",&n))
{
if (n==) break;
ans=;
build(,,n-);
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
ans+=find(,a[i]+);
update(,a[i]);
}
min=ans;
for (i=;i<=n;i++)
{
ans=ans+n--*a[i];
if (ans<min)
min=ans;
}
printf("%d\n",min);
}
return ;
}
hdu 1394(线段树) 最小逆序数的更多相关文章
- hdu 1394 线段树计算逆序数
线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...
- hdu 1394 (线段树求逆序数)
<题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...
- 线段树-最小逆序数hdu1394
title: 线段树-最小逆序数 date: 2018-10-12 17:19:16 tags: acm 算法 刷题 categories: ACM-线段树 概述 这是一道简单的线段树的题,,,当然还 ...
- HDU 1394 线段树求逆序对
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 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(线段树求逆序数---点修改)
题意:给定一个序列,求分别将前m个数移到序列最后所得到的序列中,最小的逆序数. 分析:m范围为1~n,可得n个序列,求n个序列中最小的逆序数. 1.将序列从头到尾扫一遍,用query求每个数字之前有多 ...
- hdu 1394 Minimum Inversion Number 【线段树求逆序数】
之前写过树状数组的,再用线段树写一下--- #include<cstdio> #include<cstring> #include<iostream> #inclu ...
随机推荐
- C# 反射赋值
tb_Projects model = new tb_Projects(); model.OwnerId = ; string FieldName = "OwnerId";//字段 ...
- linux基本命令练习
1. 熟悉linux命令并且练习用法以及应用场景. 初学者完成Linux系统分区及安装之后,需熟练掌握Linux系统管理必备命令,命令包括:cd.ls.pwd.clear. chmod.chown.c ...
- SVM参数解析
一.Opencv中的核函数定义(4种): 1.CvSVM::LINEAR : 线性内核,没有任何向映射至高维空间,线性区分(或回归)在原始特点空间中被完成,这是最快的选择. 2.CvSVM::POLY ...
- pring Boot 与Spring Cloud版本对应
Spring Boot Spring Cloud 1.2.x Angel版本 1.3.x Brixton版本 1.4.x Camden版本 1.5.x Dalston版本.Edgware版本 2.0. ...
- React Native 初步
[React Native 初步] 1.Create React Native App is the easiest way to start building a new React Native ...
- 模拟银行业务的JS实现
/*开户.存款.挂失.补卡.取款.转账.余额查询.密码修改.交易查询.锁定账号.解锁账号等*//*C#第7天 请参考by-Qy*/ using System;using System.Collecti ...
- Oracle 11g 静默安装-db_install.rsp详解
转自--------------https://blog.csdn.net/jameshadoop/article/details/48086933 :db_install.rsp详解 ####### ...
- WAS 与IHS集成问题
1.安装好WAS与IHS后 发布Web发现无法启动 查阅资料后发现缺少插件Plugins 于是去下载安装对应版本的Plugins 发现还是有问题 后来想起发布web01时,插件还未安装.因此重新发布一 ...
- 98. Validate Binary Search Tree (Tree; DFS)
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- eclipse项目运行文件位置
位置:E:\eclipseWorkSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\svnadmin