【HDU】hdu 1394(线段树)

hdu 1394(线段树求逆序数) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意描述:给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序 阅读详情

 

Description

The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.

For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:

a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)

You are asked to write a program to find the minimum inversion number out of the above sequences.


Input

The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.


Output

For each case, output the minimum inversion number on a single line.


Sample Input

10
1 3 6 9 0 8 5 7 4 2


Sample Output

16

 

线段树,一个叶子表示这个数字组成的逆序个数有多少个;一个节点表示这个区间的所有数字的逆序个数多少个,先计算出当前的逆序个数,然后通过公式计算逆序个数的公示来改变位置计算,最后求出最小值;

 

代码:

 

#include <iostream>
#include <cstdio>
#include<cstring>
#include<algorithm>
#define MAX 5005
using namespace std;
int que[MAX];
int test;
int tree[MAX<<2];
/*
void build ( int p,int l, int r )
{
    if ( l == r ){ tree[p] = que[l]; return ; }
    int mid = ( l + r ) >> 1;
    build ( p * 2, l , mid );
    build ( p * 2 + 1, mid + 1, r );
}*/
int finds ( int p, int l,int r, int sl,int sr)///找出没有改变的逆序数列的逆序对数;
{
    if ( l == r )
    {
        for ( int i = l + 1; i <= sr; i++ )
        {
            if ( que[i] < que[l])
                tree[p]++;
        }
        return tree[p];
    }
    int mid = ( r + l ) >> 1;
    tree[p] = finds( 2 * p, l, mid, sl, sr ) + finds( 2 * p + 1, mid + 1, r, sl, sr );
    return tree[p];
}
/*
int change(int p, int l, int r, int i)
{
    if ( l == r )
    {
        if ( l == i )
        {
            tree[p] = 0;
            return tree[p];
        }
        else
        {
            if ( que[l] > que[i] )
                tree[p]++;
            return tree[p];
        }
    }
    int mid = ( l + r ) >> 1;
    tree[p] = change(2 * p, l, mid, i) + change(2*p+1, mid+1, r, i );
    return tree[p];
}*/
int main()
{
    //freopen("in.txt","r",stdin);
    while ( cin >> test )
    {
        memset(tree, 0, sizeof(tree));
        for ( int i = 0; i < test; i++ )
        {
            scanf("%d",&que[i]);
        }
        int len = test - 1;
        int ans ;
        ans = finds(1,0,len,0,len);
        int ans1 = ans;
        for ( int i = 0; i < test; i++)
        {
            //cout << i << " " << change(1,i,i+len,i) << endl;
            ans1 += len- 2*que[i];///求逆序的个数公式;搜一遍的话超时妥妥的
            ans =  min(ans,ans1);
        }
        printf("%d\n",ans);
    }
}

 

 

 

 

 

 

 

 

用户行为数据分析 User Behavior Data from Taobao for Recommendation 一、提出问题 二、理解数据 数据来源 阿里云天池数据集:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=649) 本文选取的数据集为UserBehavior.csv,共有5242880条数据。数据的具体类别如下表所示: 用户行为种类有四种,如下表所示 对于数据维度的说明如下: 在本文选取的2017年11月25日到2017年12月3日的时间范围内,不重复的用户数量为10202,不重复的商品ID数为412369,不重复的商品类目ID数为5859, 阅读详情

相关推荐

随机向量函数链神经网络(RVFLNN)简介——附测试代码

宽度学习(Broad Learning System)原理介绍:随机向量函数链神经网络(RVFLNN) 目录宽度学习(Broad Learning System)原理介绍:随机向量函数链神经网络(RVFLNN)结构分析和训练优化 函数链神经网络(Functional-link neural network,简称FLNN)的结构如下图。 和深度神经网络结构不同的是,FLNN相当于把隐层放到了输入层中,作为增强结点(Enhancement nodes)。也可以理解成FLNN在输入层就对输入向量进行了非线性变换

weixin_44517742的博客 1万+

HDU 1394 (线段树求逆序对+思维)

HDU 1394 (线段树求逆序对+思维) 题目:        意思是,给你N个数,要求统计它的所有形式的逆序对的最小值。它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面,共有n种形式。 朴素思路 线段树求逆序对: 1、建树时每个区间初始值为0。区间维护的是当前数值是否插入。 2、读入数据,[1,n] ,按照题目的要求来 3、对这n个数进行逆序对数的求解: ① 对每一个数 a[i] 进行插入,对应的区间标记为1. ② 这个数a[i]

Chancy_Lu的博客 395

YOLOv11 网络结构详解:一文看懂 Backbone、Head、C3k2、SPPF 和 Detect 检测头

在使用 YOLOv11 进行目标检测时,我们经常会接触到或这样的模型配置文件。backbone和head分别是什么意思?ConvC3k2SPPFC2PSA这些模块分别起什么作用?P3/8、P4/16、P5/32 代表什么?为什么最后 Detect 要同时接收 3 个不同尺度的特征图?YOLOv11n、YOLOv11s、YOLOv11m、YOLOv11l、YOLOv11x 的区别在哪里?

learnerYC的博客 1809

HDU1394(权值线段树)

题目大意: 给定一个0到n-1的数字组成的序列,它的逆序数,然后把第一个数字放到末尾,得到一个新的序列,再求逆序数,再把新序列的第一个数字放到末尾,一直这样做,求所有这些序列的逆序数的最小值。 思路: 首先用权值线段树(或树状数组)求出当前序列的逆序对数。然后把第一个数放到最后一个,计算他的贡献:即他当前能组成的逆序数对为后面比他小的数(a[i]个),把他放入最后时,他贡献的逆序对数为:(n-a[...

Pandauncle的博客 501

汇川H5U搭配步进伺服电机使用CANopen通讯控制电机案例

摘要:本文介绍了基于汇川H5U PLC和STM4260B-CANopen-M步进伺服电机的控制系统搭建流程。主要内容包括:硬件准备(PLC、伺服电机、24V电源)、电机参数默认设置(地址1号、1M波特率)、使用AutoShop软件编写程序(配置CANopen参数、导入电机描述文件、设置PDO参数)以及功能块编程(使能控制、速度控制、绝对位置控制等)。通过查阅通讯手册完成各功能块参数配置,最终在主程序中调用功能块实现控制系统开发。该方案适用于需要精确运动控制的工业自动化场景。

m0_46512607的博客 1595

深入解析:武汉光庭信息技术 Android CarPlay 开发岗位的技术要求与面试准备(大连)

武汉光庭信息大连分部招聘Android CarPlay开发工程师,要求专科以上学历及2年以上Android开发经验,需精通CarPlay集成技术与车载系统开发。该职位涉及Android底层框架修改、CarPlay协议实现及车规级系统开发,需处理USB/HID驱动、图形合成等技术难点,并确保通过Apple严格认证。求职者需具备扎实的Android开发能力,熟悉车载环境特殊性,包括系统稳定性保障、人机交互适配等技术要点。文章深度解析了职位技术内涵,并提供面试问题与参考答案,帮助求职者全面准备这一复合型技术岗位。

郑伟强dev的专栏 400

HDU_1394_线段树_树状数组

题意:求逆序数,给你n个数,符合ai>aj i 1.暴力解法,记录初始序列的逆序数的总个数,每将第一个数放在最后的时候总的数目将增加n-1-a[i]个,将减少a[i]个,所以对于每个数sum += n-1-a[i]-a[i],记录最小的sum,暴力代码: #include #include using namespace std; const int N = 5000 + 5

今天的风儿好喧嚣~ 449

【Python开发者必看】Windows下Python版本管理器Pyenv安装使用,轻松管理Python版本的入门与进阶指南,从此告别Python环境不兼容的噩梦

好了,关于 【Python开发者必看】Windows下Python版本管理器Pyenv安装使用,轻松管理Python版本的入门与进阶指南,从此告别Python环境不兼容的噩梦 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。1、手动下载对应版本到 pyenv-win\install_cache 目录(如上手动操作安装步骤,文件名需匹配,如 python-3.10.0-amd64.exe)。该指令会列出,pyenv包管理工具所支持的所有python版本,

Spring Boot-Common On With You 852

hdu1394(树状数组)最小逆序对数

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22426    Accepted Submission(s): 13351 Problem Description

Kyrie_10的博客 528

MySQL数据库面试题(2022版)

序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124043363 3 Java异常面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124....

拉格朗日的学习笔记 1万+

从零学懂车载 TSN(二):802.1AS、Qbv、Qbu 是如何让 Ethernet “按时发送”的?

假设有两台设备: ECU A 认为: 但 Switch B 认为: 如果我们规定: 问题就来了。ECU:Switch:整个调度立即失效。因此 TSN 要做时间调度,第一件事就是:这就是:IEEE 802.1AS 定义时间敏感网络里的:工程中通常会看到:gPTP也就是:generalized Precision Time Protocol可以先简单理解成: 核心表达:所有 TSN 节点使用共同时间。后面抓包时你会经常遇到: 刚入门时不用急着研究每个 bit。先搞清楚它们解决什么问题。两个设备连接: A 需要知

struggle_22_58的博客 49

hdu 1394 --线段树求逆序对

题目连接 :hdu 1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

mqy224512的博客 326

Linux 设置双网卡通信,外网网卡和内网网卡

背景,Linux 主机已经安装了内网、外网 2 张网卡,目前外网网络已通,需要设置内网网卡转发通内网 内网需要通信的设备的网段,如果 10.99.0.0 代表 10.99 网段的所有 IP 表示 10.xx 网段走 10.xx.xx.xx 这个网关转发 :内网网卡设备示例 2、设置启动自动生效 打开 文件,如果没有则创建该文件,然后在文件内写入如下的内容修改上面的语句 为 即可 示例...

简简单单Onlinezuozuo 6604

[HDU 1394]Minimum Inversion Number[逆序对][线段树]

题目链接:[HDU 1394]Minimum Inversion Number[逆序对][线段树] 题意分析: 实质上来说,这道题就是求n个小于n的数的排列变成环之后,从其中某一点切开的最小逆序对数。 解题思路: 第一步:求出初始逆序对数。可以用归并排序,这里我用了线段树。 能使用线段树的理由:线段树存储的是一个区间段的值,应用到求逆序对数,我们就可以让它初始时都为0,每次加入一个数x前

闲停 819

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

hdu 1394 线段树求逆序数

/*       线段树求逆序数   求小逆序数   神奇     题意:给定一个序列,对该序列的n种排列(排列如下)的每种排列(0 ~ n-1)的逆序数求最小值:        a1, a2, ..., an-1, an          a2, a3, ..., an, a1          a3, a4, ..., an, a1, a2          ...  

侧耳倾听 743

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

hdu-1394(暴力 / 线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:   输入一个整数n,接下来随意顺序输入0到n-1之间的数,然后你可以将每一串这样的数的第一个数移到最后一位去,形成新的数字串。要求你输出这样的操作得到的不同数字串中逆序数的最小个数。 思路:   首先需要了解一下什么是逆序数,逆序数就是与标准列顺序相反的数。比如标准列是...

dgbxssz959266的博客 219

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HDU 1394 Minimum Inversion Number(线段树单点更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:有0~n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,每得到一个序列都可得出该序列的逆序数(如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数)。要求求出最小的逆...

aocang4831的博客 219

HDU1394 - Minimum Inversion Number(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394题目大意:给定一个由00到n−1n-1组成,长度为nn每个元素唯一的序列,可以进行一种操作,把第一个元素放到最后一个位置。求经过若干次操作后的,最小逆序对数。解题过程:这题之前写过一个暴力解法的题解,现在用线段树来解决一下。题目分析:这里用线段树主要是求解初始状态的逆序对数,对于每次的操作有一个结论

ACM_Fish的博客 401

hdu-1394(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 思路:建立一个空线段树,求出逆序数,(逆序数性质:交换两个相邻数,逆序数+1或-1, 交换两个不相邻数a, b, 逆序数+=两者间大于a的个数-两者间小于a的个数) #include<iostream> #include<cstring> #include&l...

weixin_30454481的博客 121

hdu1394 线段树求最小逆序数

hdu 1394 http://acm.hdu.edu.cn/showproblem.php?pid=1394 用线段树求逆序数,例如要求x的逆序数只需要访问(x+1,n)段有多少个数,就是x的逆序数。还有就是求最小逆序数的时候有个巧妙的想法,当把x放入数组的后面,此时的逆序数应该为x没放入最后面之前的逆序总数加上(n-x)再减去(x-1);sum = sum+(n-x[i])-(x[i]-1

http://kingim.cn/ 1145

hdu1394(线段树求逆序数)

题目链接:hdu1394 思路: 先用线段树求出原始序列的逆序对数。 序列中的n个数的范围是0~n-1,这点需要注意,根据这点可以很快速的求出改变后的序列的逆序对数。把位于第一位的num[i]移到最后一位,则变化的逆序对数是在上一个序列(即num[i]为第一位的序列)的基础上加上比num[i]大的数的个数,再减去比num[i]小的数的个数(因为num[i]移到最后以后,只能与前面比他大的数构

no pains,no gains 1347

HDU-1394 线段树+逆序数

思路 查询该数到n已经插入的个数,再单点更新该数sum[root]=1,最后求出所有的逆序数的个数。 每次换到后面,说明小于a[i]有a[i]个数 大于a[i]有n-a[i]-1个数 说明少了有a[i]个逆序数 多了n-a[i]-1个逆序数。 import java.util.Scanner; public class Main_HDU1394 { static int n; st...

weixin_45948204的博客 152

hdu 1394 Minimum Inversion Number(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目大意:求数组的逆序数和,然后把第一个元素放最后,求一个新的逆序数和,重复操作,问最小的逆序数是多少。 数组大小为n,元素为0-n-1的数,且不重复。题目说了是a permutation of the n integers from 0 to n-1. 。 分成两步:先求原数

Algobird 507

HDU 1394 Minimum Inversion Number(线段树求逆序对数)

/* HDU1394 利用线段树求逆序对数 方法: 从1……n插入每个数,每插入一个数,计算当前线段树中数为a[i]+1....maxval的数有多少个,特别需要当心a[i]+1有可能大于maxval的情况 交换两个相邻数,逆序数+1或-1, 交换两个不相邻数a, b, 逆序数+=两者间大于a的个数-两者间小于a的个数 对于本题,可以假设在第n+1个位置上有一个数n,每次将...

120

hdu 1394 线段树

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

u012342878的专栏 426

线段树求逆序数 HDU 1394 POJ2299

线段树求逆序数模板 #include<iostream> #include<cstdio> #include<string.h> using namespace std; const int maxn=1e5+5; struct node{ int l,r,value; }tree[maxn<<2]; void build(int m,int l,...

青春苦瓜 211
上一篇: 【HDU】hdu 2795
下一篇: 【POJ】poj 2528 (线段树_离散化)
三生石1103
博客等级 码龄12年 16粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值