hdoj Cow Sorting 2838 (树状数组)

原创 2015年11月18日 14:09:48

Cow Sorting

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


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).
 
#include<stdio.h>
#include<string.h>
#define N 100010
#define ll __int64
int n;
struct zz
{
	int cnt;
	ll sum;
}q[N<<2];
ll lobit(int x)
{
	return x&(-x);
}
int update(int gen,int v)
{
	while(gen<=n)
	{
		q[gen].sum+=v;
		q[gen].cnt+=1;
		gen+=lobit(gen);
	}
	return 0;
}
int query(int gen)//返回x前面比x小的元素的个数 
{
	int ans=0;
	while(gen>0)
	{
		ans+=q[gen].cnt;
		gen-=lobit(gen);
	}
	return ans;
}
ll querys(int gen)//返回x前面所有数的和 
{
	ll ans=0;
	while(gen>0)
	{
		ans+=q[gen].sum;
		gen-=lobit(gen);
	}
	return ans;
}
int main()
{	
	int i,x;
	while(scanf("%d",&n)!=EOF)
	{	
		ll ans=0;
		memset(q,0,sizeof(q));
		for(i=1;i<=n;i++)
		{
			scanf("%d",&x);
			update(x,x);
			ll k=i-query(x);//k表示有多少个数是逆序的 
			if(k!=0)
			{
				ll kk=querys(n)-querys(x);//前n个数之和减去比x大的数即为所求。 
				ans+=k*x+kk;
			}
		}
		printf("%I64d\n",ans);
	}
	return 0;
}

HDU - 2838 Cow Sorting解题报告(树状数组求逆序数相关+技巧)

题目大意:有很多的牛n(100,000),每个牛都有一个暴躁值,现在想把这些牛按照暴躁值从小到大排序,每次只能交换两头相邻的牛,交换他们付出的代价就是,两头牛暴躁值的和。现在问你把这些牛按照暴躁值从小...

杭电2838 Cow Sorting(树状数组)

Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota...

hdu 2838 Cow Sorting(树状数组)

真是得跪,,,我以前做的求逆序数若爆了,连芒果大神都对我无语了。呜呜呜 这题和poj那道置换数很像,但是这题要求必须相邻的数才能交换。这就可以用树状数组求数x之前比x大的数量和比x大的数的和。 以...
  • cqlf__
  • cqlf__
  • 2012年09月21日 14:53
  • 454

hud 2838 Cow Sorting 树状数组求逆序数

这道题纠结了很长时间0.0,今天早起重写了一发结果就a 了,Orz 主要原因还是算逆序数个数的时候没开long long,我还以为算sum的和的时候开long long 就好了,没想到光光是逆序数的个...

hdu 2838 Cow Sorting 树状数组

hdu2838 ------希望30号驾校科目一顺利考完,4月即将过去说好的30篇博客也没完成, 真是忙起来就会烦躁什么都不想做,勿忘心安。。。。      《Cow Sorting》 这题本来兴...

HDU 2838 Cow Sorting(树状数组)

HDU 2838 Cow Sorting(树状数组) 分析: 首先每次只能交换相邻的两头牛,并且最后要求升序排列,所以最后整个序列的逆序是0,每次交换只可以消除1个逆序。(令a[i]的逆序是从1到i-...

HDU 2838 cow sorting 树状数组

话说这道题要用的三个树状数组,不容易啊。我刚开始想的时候想明白了用公式怎么算,却想不出来怎么转化到树状数组上,总感觉有些地方实现不了,原来竟然是用三个树状数组。。。这让只写过一个树状数组的孩纸情何以堪...

HDU 2838 Cow Sorting(树状数组求逆序数)

题目链接:点击打开链接 树状数组求逆序数的一个模板题。 对于给定的序列,变为递增顺序,每个位置的数的交换次数即为该数组成的逆序对的个数,所以此类题转化为求每个位置的逆序对。num数组保存的为原始数据序...
  • ccDLlyy
  • ccDLlyy
  • 2017年07月17日 00:25
  • 113

HDU2838 Cow Sorting【树状数组】【逆序数】

题目大意: 有N头奶牛排成一排。每头奶牛都有一个唯一的"坏脾气"值。坏脾气的范围为1~100000。现在将 奶牛重新排序,使奶牛按照坏脾气增加的顺序排列。所有的奶牛都可以相互交换位置。但是交换脾 气值...

HDU 2838 Cow Sorting [树状数组]【数据结构】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 —————————————————-. Cow SortingTime Limit: 200...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj Cow Sorting 2838 (树状数组)
举报原因:
原因补充:

(最多只允许输入30个字)