题目链接

题目翻译:

约定数字序列a1,a2,...,an的反转数是满足i<j和ai>aj的数对(ai,aj)的数量。

对于给定的数字序列a1,a2,...,an,如果我们将第1到m个数字移动到序列的末尾,我们将获得另一个序列(m>=0,当m=0时就不移动任何数)。这样,总共就会有n个序列,如下:

a1,a2,...,an-1,an     (其中m = 0,即初始序列)
a2,a3,...,an,a1         (其中m = 1)
a3,a4,...,an,a1,a2 (其中m = 2)
...
an,a1,a2,...,an-1     (其中m = n-1)
输出这n个序列中反转数最小的序列的反转数。

(根据Google网页翻译整理而成)

思路:

这道题我是用权值线段树来做的,所谓权值线段树,就是维护一个计数数组,类似于桶排序中的桶,而不是维护一个序列。这道题中,我们可以从1到n依次在线段树中插入ai,如果ai=233就在第233个位置上上+1,如果ai=666就在第666个位置上+1......然后统计前面的数有多少是大于ai的,也就是[ai+1,n],累加到答案里就好了。

但是题目中要求的不只是初始序列啊?难道要每个不同的序列都算一遍?不不不,我们观察一下题目中列举的那几个序列,可以发现,其实每一个序列都是把前一个序列中的第一个数放到最后形成的。那么既然是从第一位移到最后一位,那就很好办了。假设这个要移动的数是x吧,当x移到后面之后,答案减少的数量就是x-1,因为x移动前是第一位,所以移动前所有的比它小的数都可以和它组成题目中的合法数对啊,但这样一移动,这些方案就没有了;答案增加的数量就是n-x,因为x移动后是第最后一位,所以移动后所有的比它大的数都可以和它组成题目中的合法数对,这样一移动,就新增加了这些方案。这样就可以每次都从前一个序列的反转数算出当前序列的反转数,从而提高程序效率了。

时间复杂度:O(Tnlogn)。

(T为数据组数)

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int s[5005],tree[20005];
//线段树板子
void add(int p,int l,int r,int x)
{
if(l==r) { tree[p]++; return; }
int mid=(l+r)>>1;
if(x<=mid) add(p<<1,l,mid,x);
else add((p<<1)+1,mid+1,r,x);
tree[p]=tree[p<<1]+tree[(p<<1)+1];
}
int ask(int p,int l,int r,int x,int y)
{
if(l==x&&r==y) return tree[p];
int mid=(l+r)>>1;
if(y<=mid) return ask(p<<1,l,mid,x,y);
if(x>mid) return ask((p<<1)+1,mid+1,r,x,y);
return ask(p<<1,l,mid,x,mid)+ask((p<<1)+1,mid+1,r,mid+1,y);
}
int main()
{
int n=0;
while(~scanf("%d",&n))
{
memset(tree,0,sizeof(tree));//记得初始化
int ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]),s[i]++;
add(1,1,n,s[i]);
if(s[i]<n) ans+=ask(1,1,n,s[i]+1,n);//注意不要越界
}
int anss=ans;
for(int i=1;i<=n-1;i++)
{
ans=ans-(s[i]-1)+(n-s[i]);//由前一个序列转到当前序列
anss=min(anss,ans);
}
printf("%d\n",anss);
}
return 0;
}

Hdu P1394 Minimum Inversion Number | 权值线段树的更多相关文章

  1. hdu 5592 ZYB's Premutation (权值线段树)

    最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  2. HDU - 5592 ZYB's Premutation (权值线段树)

    题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...

  3. HDU 5249:KPI(权值线段树)

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  4. ACM Minimum Inversion Number 解题报告 -线段树

    C - Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  5. HDU 1394 Minimum Inversion Number (数据结构-段树)

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

  6. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  7. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  8. HDU - 2665 Kth number 主席树/可持久化权值线段树

    题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...

  9. HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others)    M ...

随机推荐

  1. vue-router路由钩子

    路由跳转前后,需要做某些操作,这时就可以使用路由钩子来监听路由的变化. 接收三个参数: to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: F ...

  2. Django学习day08随堂笔记

    今日考题 """ 今日考题 1.聚合查询,分组查询的关键字各是什么,各有什么特点或者注意事项 2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他用法 3.列举常 ...

  3. 变着花样来接参,PHP中接收外部参数的方式

    对于PHP这样一个web语言来说,接参是非常重要的一个能力.毕竟从前端表单或异步请求传递上来的数据都要获取到才能进行正常的交互展示.当然,这也是所有能够进行web开发的语言的必备能力.今天我们就来看看 ...

  4. IDEA - 2019中文版安装教程

    前言 个人安装备忘录 软件简介 IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持. ...

  5. v-for为什么最好(一定)要加key

    v-for 指令基于一个数组来渲染一个列表,如下 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> ...

  6. 自然语言处理标注工具——Brat(安装、测试、使用)

    一.Brat标注工具安装 1.安装条件: (1)运行于Linux系统(window系统下虚拟机内linux系统安装也可以) (2)目前brat最新版本(v1.3p1)仅支持python2版本运行使用( ...

  7. HBase 与 Cassandra 架构对比分析的经验分享

    架构对比 HBase和Cassandra几乎是一个年份发起,又都是在2010年成为Apache的顶级项目,不过如果我们去细品其内部机制,我们会发现其实两者是完全不同的架构风格. HBASE起源于Goo ...

  8. 阿里 Midway 正式发布 Serverless v1.0,研发提效 50%

    Github:https://github.com/midwayjs/midway 开源为了前端和 Node.js 的发展,点 Star! 去年阿里提出 Serverless 架构,并利用其新一代研发 ...

  9. MySQL8 根据某属性查询字段排名由自定义变量到rank()的变动

    在mysql8 之前的版本,因为没有rank()方法的存在,所以在对字段进行排名时,使用的是自定义自变量的方法,比如: select id,name,@rank=@rank+1 as ranks fr ...

  10. uoj21 缩进优化(整除分块,乱搞)

    题目大意: 给定一个长度为\(n\)的序列 让你找一个\(x\),使得\(ans\)尽可能小 其中$$ans=\sum_{i=1}^{n}\lfloor\frac{a_i}{x}\rfloor + \ ...