HDOJ2838(树状数组)
2016-07-01 23:11
211 查看
大意:求所有逆序数对的和
分析:对于数a,他的逆序数对之和为:逆序对数*a+a之前比a大的数。开两个树状数组,一个求逆序对数,一个求和。
代码:
分析:对于数a,他的逆序数对之和为:逆序对数*a+a之前比a大的数。开两个树状数组,一个求逆序对数,一个求和。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 100001 using namespace std; struct tree { int t; long long sum; }tree[MAXN]; int n; int lowbit(int i) { return i&(-i); } void update(int i, int s, int x) { while (i <= n) { tree[i].t += x; tree[i].sum += s; i = i + lowbit(i); } } int queryx(int n) { int ans = 0; while (n > 0) { ans += tree .t; n -= lowbit(n); } return ans; } long long querysum(int n) { long long ans = 0; while (n > 0) { ans += tree .sum; n -= lowbit(n); } return ans; } int main() { while (~scanf("%d", &n)) { long long ans = 0; memset(tree, 0, sizeof(tree)); for (int i = 1; i <= n; i++) { int a; scanf("%d", &a); update(a, a, 1); long long k = i - queryx(a); if (k != 0) { long long k1 = querysum(n) - querysum(a);//前n个数之和减去比a小的数之和,即比a大的数之和。 ans += k*a + k1; } } printf("%lld\n", ans); } return 0; }
相关文章推荐
- iOS开发工具箱
- 使用Ant定义生成文件
- TYVJ 1864 BZOJ 3029 守卫者的挑战
- AndroidStudio 报错 finished with non-zero exit value 2
- Github优秀开源项目(注意!!里面有 巨图 和 大型gif图)
- Android之手机通知栏Notification介绍(一)
- 圣彼得堡悖论之破解
- protues-秒表计时(8255,8253)(内含简单源码-数码管亮)
- java学习中一些基础知识(二)
- Ubuntu 16.04 64位 搭建 node.js NodeJS 环境
- Ant安装
- iot 表 主键索引叶子块包含了表所有数据
- iot 表 主键索引叶子块包含了表所有数据
- iot 表 主键索引叶子块包含了表所有数据
- android 批量打包
- Android Studio官方文档之从Eclipse迁移到Android Studio开发篇
- jQuery_Javascript_css菜单选择对应模块显示隐藏
- https的通信过程详解
- 关于拉格朗日对偶问题中对偶性的理解
- MachineLearning01_DecisionTree(决策树)