hdu 2838 Cow Sorting(树状数组)

hdu 2838 Cow Sorting(树状数组)

大家好,又见面了,我是全栈君。

Cow Sorting

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2239    Accepted Submission(s): 711




Problem Description
Sherlock’s N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening. Each cow has a unique “grumpiness” level in the range 1…100,000. Since grumpy cows are more likely to damage Sherlock’s milking equipment, Sherlock would like to reorder the cows in line so they are lined up in increasing order of grumpiness. During this process, the places of any two cows (necessarily adjacent) can be interchanged. Since grumpy cows are harder to move, it takes Sherlock a total of X + Y units of time to exchange two cows whose grumpiness levels are X and Y.

Please help Sherlock calculate the minimal time required to reorder the cows.

 


Input
Line 1: A single integer: N

Lines 2..N + 1: Each line contains a single integer: line i + 1 describes the grumpiness of cow i.
 


Output
Line 1: A single line with the minimal time required to reorder the cows in increasing order of grumpiness.
 


Sample Input
   
   
3 2 3 1

 


Sample Output
   
   
7
Hint
Input Details Three cows are standing in line with respective grumpiness levels 2, 3, and 1. Output Details 2 3 1 : Initial order. 2 1 3 : After interchanging cows with grumpiness 3 and 1 (time=1+3=4). 1 2 3 : After interchanging cows with grumpiness 1 and 2 (time=2+1=3).

题意:给出一组数从1到N打乱,要求把数组又一次有序(从小到大),仅仅能交换相邻的两个数字。代价为相邻两个数字和。求最小代价?

思路:对于每一个数字x,我们仅仅须要把它和前面比它大的数字交换。求出交换代价,反复运行就能得出答案。

这个代价就是,比它大的数字个数t*x+前面比它大的数字和。

<pre name="code" class="cpp">#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<functional>
#include<iostream>
using namespace std;
#define N 100005
#define ll __int64
int a[N],cnt[N],n;   //记录数字个数
ll sum[N];      //记录数字和
int lowbit(int x)
{
    return x&(-x);
}
void add(int x)
{
    int d=x;
    while(x<=n)
    {
        cnt[x]++;
        sum[x]+=d;
        x+=lowbit(x);
    }
}
int sum1(int x)   //求比x小的数字已经出现几个(包含x)
{
    int s=0;
    while(x)
    {
        s+=cnt[x];
        x-=lowbit(x);
    }
    return s;
}
ll sum2(int x)  //求当前出现的比x大的数字和
{
    ll s=0;
    while(x)
    {
        s+=sum[x];
        x-=lowbit(x);
    }
    return s;
}
int main()
{
    int i,k,t;
    while(scanf("%d",&n)!=-1)
    {
        memset(cnt,0,sizeof(cnt));
        memset(sum,0,sizeof(sum));
        ll ans=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            add(a[i]);
            t=sum1(a[i]);  
            k=i-t;   //前面有几个比x大的数
            if(k!=0)
            {
                ans+=(ll)a[i]*k;       //注意数字会超出int
                ans+=sum2(n)-sum2(a[i]);  //求当前位置出现的比x大的数字和
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116466.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常用数据库端口号总结

    关系型数据库:1.Oracle数据库默认端口号为,1521;2.MySQL数据库默认端口号为,3306;3.SQLServer数据库默认端口号为,1433;4.postgreSQL数据库默认端口号为,5432;NOSQL数据库:1.MongoDB默认端口号为:27017;2.Redis默认端口号为:6379;3.memcached默认端口号为:11211;…

    2022年4月6日
    123
  • 深究递归和迭代的区别、联系、优缺点及实例对比「建议收藏」

    深究递归和迭代的区别、联系、优缺点及实例对比「建议收藏」深究递归和迭代的区别、联系、优缺点及实例对比1.概念区分递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或函数里面调用自身;

    2022年6月5日
    43
  • python基础语法记录

    python基础语法记录1 代码中包含中文 就需要在头部指定编码 Python3 源码文件默认使用 utf 8 编码 所以可以正常解析中文 无需指定 UTF 8 编码 注意 如果你使用编辑器 同时需要设置 py 文件存储的格式为 UTF 8 coding utf 8 coding UTF 8 2 实例缩进为四个空格如输入 table 键或非四空格报错 IndentationE unindentdoes

    2025年9月7日
    0
  • mac 激活码GoLand 2021.2.3 破解(JetBrains全家桶)

    (mac 激活码GoLand 2021.2.3 破解)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsa…

    2022年3月27日
    1.2K
  • clion激活码(JetBrains全家桶)「建议收藏」

    (clion激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWN…

    2022年3月21日
    96
  • Struts2 FilterDispatcher的作用[通俗易懂]

    Struts2 FilterDispatcher的作用[通俗易懂]org.apache.struts2.dispatcher.FilterDispatcher是Struts2的主要的Filter,负责四个方面的功能:  (1)执行Actions  (2)清除ActionContext  (3)维护静态内容  (4)清除request生命周期内的XWork的interceptors  另注:该过滤器应该过滤所有的请求URL。一般被设置

    2022年8月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号