hdunbsp;1394

2024-04-01 17:38
文章标签 hdunbsp 1394

本文主要是介绍hdunbsp;1394,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解题报告

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

题目大意:给定序列,序列可变换即将前面i个移到序列后边,问经过变换可得到的最小的逆序数是多少?

思路:最近状态一塌糊涂啊,一开始居然连怎样利用求和的思想去就逆序数都不会了,想了半天也没想起来,看了看别人的解题报告才又一次恍然大悟,就是记录每个数字在他之前一共出现了多少个比他小的数,这样用它出现的时刻减去前面出现的比他小的数,剩下的就是比他大的,也就是由他导致的逆序数的个数,然后将这些数加起来。然后题目又是让求所有变换中的最小的,一想这样的题目肯定变换有递推公式,于是想了半天记录每个数之前比他小,之后比他大之类的信息,最后发现还是推不出来,于是没办法由又去看别人怎么说,一看又恍然大悟,每次都是相当于将最顶头的数拿到最后边,这是这个问题最关键独特的地方啊,居然没有注意到,编程珠玑真是白看了。注意到了这一点,递推公式也就好推了。

收获与体会:要赶紧找回感觉了。

AC code

#include <cstdio>

#include <cstring>

 

#define MAXN 5010

int tray[MAXN], data[MAXN];

 

void Updata(int start, int C, intlimit){

    for(int i = start; i <limit; i += i & -i) tray[i]+= C;

}

 

int Getsum(int start, int limit){

    int ans = 0;

    for(int i = start; i >limit; i -= i & -i) ans +=tray[i];

    return ans;

}

 

int main(){

    int n, ans, now;

    while(~scanf("%d", &n)){

       memset(tray, 0, sizeof(tray));

       ans = 0;

       for(int i = 1; i <=n; ++ i){

           scanf("%d",&data[i]);

           Updata(data[i] + 1,1, n + 1);

           ans += i -Getsum(data[i] + 1, 0);

       }

       now = ans;

       for(int i = 1; i <=n; ++ i){

           now = now +(n - 2 * data[i] - 1);

           if(now < ans) ans = now;

       }

       printf("%d\n",ans);

    }

    return 0;

}

 

 

 

 

 

 

这篇关于hdunbsp;1394的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867753

相关文章

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

题目地址:HDU 1394 这题可以用线段树来求逆序数。 这题的维护信息为每个数是否已经出现。每次输入后,都从该点的值到n-1进行查询,每次发现出现了一个数,由于是从该数的后面开始找的,这个数肯定是比该数大的。那就是一对逆序数,然后逆序数+1.最后求完所有的逆序数之后,剩下的就可以递推出来了。因为假如目前的第一个数是x,那当把他放到最后面的时候,少的逆序数是本来后面比他小的数的个数。多的逆序数

【线段树】hdu 1394 Minimum Inversion Number

题意:求Inversion后的最小逆序数 思路:用O(nlogn)复杂度求出最初逆序数后,就可以用O(1)的复杂度分别递推出其他解 线段树功能:update:单点增减 query:区间求和 #include<iostream>#include<algorithm>using namespace std;int sum[10001],x[5001];void pushup(int

uva 1394 - And Then There Was One(约瑟夫环)

题目链接:uva 1394 - And Then There Was One 题目大意:给出n,k和m,表示有n个人围成一个圈,从第m个人开始(m也要去掉),每次走k步删除掉,问最后剩下人的序号。 解题思路:约瑟夫环的小变形,套公式dp[i] = (dp[i-1] + k)%i。 #include <stdio.h>int main () {int n, k, m;wh

HDUnbsp;1215--七夕节

七夕节 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2628 Accepted Submission(s): 986 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的

Minimum Inversion Number HDU - 1394(逆序数变形)

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 >=

hdunbsp;1007nbsp;平面最近点对nbsp;nbsp;随机增量…

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1007   题目大意:求平面内最近点对的距离   考查点:求平面最近点对的较快算法,(二分或随机增量)   思路:当我们确定了一个两点之间的距离r以后,就可以在平面上画出一个正方形表格来 正方形的边长为r,这样可能与点x更新r的点只能在x所在点的8个方向及自己所在格子。 这样我们就可以将问题的

Minimum Inversion Number HDU 1394

用树状数组求逆序数。 #include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 5004int a[maxn];int n=maxn;int lowbit(int i){return i&(-i);}int Sum(int i){int sum=0;while(

hdu 1394——Minimum Inversion Number

线段树 //31MS 340K c++#include<iostream>#include<cstdio>using namespace std;#define maxn 5010#define ls (rt<<1)#define rs (rt<<1|1)#define mid ((t[rt].l+t[rt].r)>>1)struct tree{int l,r;int sum;

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

树状数组求逆序数的应用。。这一题设计的非常巧妙。。。下面说一下题意。。给定一组数,然后依次的挪动该组数的元素共得到n种序列。求这n中序列中逆序数最少的个数。。。杯具的是我竟然把树状数组和一般的数组弄混淆了。。这里要特别注意。。。不过值得一提的是竟然rank1,(*^__^*) 嘻嘻…… AC代码: #include<iostream>#include<cstdio>#include<s

相机的CL、USB3.0、1394、USB2.0和GIGE接口详解和区别

相机的CL接口、USB3.0、1394、USB2.0和GIGE接口都是相机中常用的接口类型,它们在功能、传输速率、应用场景等方面存在一些区别。 CL接口:CL接口通常指的是命令行接口(Command Line Interface),它是一种基于文本的交互方式,通过命令行输入指令来执行各种操作。CL接口在操作系统命令行模式下运行,可以用于执行各种命令和脚本,包括PHP等脚本语言的执行。 USB3