杭电 2838 牛叉的树状数组
来源:互联网 发布:抢注域名 编辑:程序博客网 时间:2024/06/16 18:15
话说这道题要用的三个树状数组,不容易啊。我刚开始想的时候想明白了用公式怎么算,却想不出来怎么转化到树状数组上,总感觉有些地方实现不了,原来竟然是用三个树状数组。。。这让只写过一个树状数组的孩纸情何以堪?
具体来说,有一个num数组,里面记录的是插入a[i]后,在a[i]之前插入且比a[i]小的数的个数;还有一个totalsum数组,记录的是插入第i个数后,前i-1个数的总和;还有一个smallersum数组,记录的是插入a[i]后,在a[i]之前插入且比a[i] 小的数的总和。这样最后就可以算出来了。题目:
Cow Sorting
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 941 Accepted Submission(s): 286
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.
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.
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
3231
Sample Output
7HintInput DetailsThree cows are standing in line with respective grumpiness levels 2, 3, and 1.Output Details2 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 <iostream>#include <cstdio>#include <string.h>using namespace std;const int M=100010;_int64 num[M],totalsum[M],smallersum[M];_int64 lowbit(_int64 y){ return y&(-y);}void add(_int64 x[],_int64 xx,_int64 yy){while(xx<M){ x[xx]+=yy; xx+=lowbit(xx);}}_int64 sum(_int64 x[],_int64 xx){ _int64 ss=0; while(xx>0){ ss+=x[xx];xx-=lowbit(xx); } return ss;}int main(){ //freopen("1.txt","r",stdin); _int64 n; while(~scanf("%I64d",&n)){ memset(num,0,sizeof(num));memset(totalsum,0,sizeof(totalsum));memset(smallersum,0,sizeof(smallersum));_int64 x;_int64 ans=0,count=0;for(_int64 i=1;i<=n;++i){ scanf("%I64d",&x); add(num,x,1); add(totalsum,i,x); add(smallersum,x,x); count=sum(num,x-1); ans+=(i-count-1)*x; ans+=sum(totalsum,i-1); ans-=sum(smallersum,x-1);}printf("%I64d\n",ans); } return 0;}
- 杭电 2838 牛叉的树状数组
- 树状数组-杭电-5592
- 杭电1166敌兵布阵 (用的树状数组)
- 杭电2838 Cow Sorting(树状数组)
- 杭电oj 1541 树状数组
- 杭电OJ 敌兵布阵 树状数组
- 杭电 2852 树状数组+二分
- 杭电 1556 (树状数组)
- 杭电 1541 Stars 树状数组
- 树状数组简单题----杭电1541
- 杭电Sort it 2689树状数组
- 【树状数组 + 简单题】杭电 hdu 1166 敌兵布阵
- 杭电 OJ Color the ball 树状数组
- 【树状数组+简单题】杭电 hdu 2689 Sort it
- 【树状数组+三维】杭电 hdu 3584 Cube
- 【树状数组+二维】杭电 hdu 1892 See you~
- 杭电hdu 2492 Ping pong 树状数组
- 杭电1166 敌兵布阵 线段树and树状数组
- SQLite3中针对Objective-C的持久框架
- 大崩溃-正在降临的危机与金融风暴史(The Great Crash) 第四章 大 崩溃:不仅仅是股市
- Linux文件操作函数open close read write等示例
- ubuntu 11.10中丧失guest环境
- css
- 杭电 2838 牛叉的树状数组
- ajax实现数据库用户名的唯一性
- javascript案例
- 174. Friends are thieves of time.朋友是时间的窃贼
- Ubuntu编译错误: XftConfig_current_buffer 未定义
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- 黑马程序员-在C#中备份和恢复Microsoft SQL Server数据库
- 表单,文本框 + 文本框 = 文本框,输入两个整数,求和
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3