hdu2838
来源:互联网 发布:淘宝电脑主机才500多 编辑:程序博客网 时间:2024/06/03 16:26
http://acm.hdu.edu.cn/showproblem.php?pid=2838
题意 n个数的排列,每次可以互换相邻的元素,最终变成一个递增的序列,每次互换的代价为互换的两个数的和,求最小代价。
每次处理前i个,也就是顺序处理就是最小,假如第i个数为a[i],那么需要的代价为a[i]*c+sum(a[i]),c是a[i]前比a[i]大的数的个数,sum(a[i])是a[i]前比a[i]大的数的和,用树状数组,两个数组,一个存个数,一个存和
#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long ll;const int maxn=100010;ll a[maxn];ll b[maxn],c[maxn];//b是比a[i]小的个数,c是比a[i]小的数的和int n;ll lowbit(ll x){ return x&-x;}ll sum_b(ll x){ ll ret=0; while(x>0) { ret+=b[x]; x-=lowbit(x); } return ret;}ll sum_c(ll x){ ll ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret;}void update(int i,int j){ while(i<=n) { b[i]+=1; c[i]+=j; i+=lowbit(i); }}int main(){ while(scanf("%d",&n)!=-1) { long long ans=0,cnt=0; memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); update(a[i],a[i]); cnt+=a[i]; ans+=a[i]*(i-sum_b(a[i])); ans+=cnt-sum_c(a[i]); } printf("%lld\n",ans); } return 0;}
0 0
- hdu2838
- hdu2838
- hdu2838 Cow Sorting
- 逆序对(hdu2838)
- hdu2838之树状数组
- hdu2838 cow sorting
- HDU2838-简单树状数组
- hdu2838——Cow Sorting
- 树状数组 hdu2838 Cow Sorting
- HDU2838 Cow Sorting 树状数组
- hdu2838 Cow Sorting(树状数组)
- hdu2838 Cow Sorting 树状数组
- HDU2838 Cow Sorting (树状数组)
- HDU2838 Cow Sorting (逆序数+求和)
- HDU2838 Cow Sorting【树状数组】【逆序数】
- HDU2838(树状数组求逆序数)
- 树状数组专题(八)hdu2838计算逆序数
- HDU2838 Cow Sorting 树状数组 区间求和加逆序数的应用
- 蘑菇街购物车动态添加
- centos上安装 oracle jdk7
- Android studio如何将项目生成doc文档
- 【PAT】 Deepest Root (DFS)
- redis数据类型(四)集合类型
- hdu2838
- 挂载另一台Linx服务器文件系统的方法
- Java中只有按值传递,没有按引用传递
- 关于Spring中的<context:annotation-config/>配置
- 默认Action的配置
- AF二次封装
- ElasticSearch(十一)-深入分片
- 使用IDEA搭建Spark源码环境及编译Spark源码
- Android 关闭Log日志