树状数组题目总结三( 上)( HOJ 2275 Number sequence )
2012-10-23 22:55
567 查看
HOJ 2275(水题)
题目:计算序列 a[] 中, 当 i < j < k, a[i] < a[j] > a[k], 这样的三元组的个数。
分析:首先, 我们可以以中间的数字a【j】 为中间点,计算当前它前面比它小的有多少个点,以及比它大的有多少点;建树完毕时,即所有的点都被插入的时候,我们再求在此点插入之后,有多少个比他大的点被插入(和之前的求差就行)。
代码如下:
题目:计算序列 a[] 中, 当 i < j < k, a[i] < a[j] > a[k], 这样的三元组的个数。
分析:首先, 我们可以以中间的数字a【j】 为中间点,计算当前它前面比它小的有多少个点,以及比它大的有多少点;建树完毕时,即所有的点都被插入的时候,我们再求在此点插入之后,有多少个比他大的点被插入(和之前的求差就行)。
代码如下:
#include <cstdio> #include <cstring> #define Max 32769 int n; long long bit[Max]; struct node { int f, l, dig; }num[50010]; inline int Lowbit ( int x ) { return x & ( -x ); } void Update ( int pos, int num ) { for ( ; pos < Max; bit[pos] += num, pos += Lowbit ( pos ) ); } int Sum ( int end ) { int sum = 0; for ( ; end > 0; sum += bit[end], end -= Lowbit ( end ) ); return sum; } int main() { while ( scanf("%d", &n ) != EOF ) { for ( int i = 1; i <= n; ++i ) { scanf( "%d", &num[i].dig ); num[i].dig++; num[i].f = num[i].l = 0; } memset( bit, 0, sizeof(bit) ); long long ans = 0; for ( int i = 1; i <= n; ++i ) { Update ( num[i].dig, 1 ); if ( num[i].dig > 1 ) num[i].f = Sum(num[i].dig - 1); } for ( int i = 1; i <= n; ++i ) { if ( num[i].dig > 1 ) num[i].l = Sum(num[i].dig - 1) - num[i].f; ans += num[i].f * num[i].l; } printf ( "%lld\n", ans ); } }
相关文章推荐
- HOJ 2275 Number sequence(树状数组)
- -----hoj 2275 Number sequence(树状数组)
- hoj 2275 Number sequence(树状数组)
- HOJ 2275 Number sequence(树状数组)
- HOJ 2275——Number sequence(树状数组)
- HOJ 2275 Number sequence(树状数组) 大于小于问题
- hoj 2275 树状数组 水··不能int 64
- hoj (2275)树状数组
- 线段树和树状数组题目总结(未完)
- ( poj 2352,poj 3067, poj2481)树状数组题目总结(二)
- 树状数组题目总结(一)
- 树状数组学习以及题目总结
- 线段树和树状数组题目总结(未完)
- 树状数组---逆序类题目
- 树状数组总结~
- HOJ 1016 Joseph's problem I 树状数组求第K大
- 常用算法题目总结一(数组篇)
- hoj 2430 Counting the algorithms(树状数组,贪心)
- HDOJ题目1541 Stars(树状数组单点更新)
- HDOJ 题目1166 敌兵布阵(树状数组单点跟新)