赞
踩
- /*树状数组案例:
- 给出数组a[1], a[2], ... , a[n]
- 输出数组ans[1], ans[2], ... , ans[n] 满足
- ans[i](0 < i <= n)的值是集合{a[j] | 0 < j < i 且 a[j] < a[i])}
- 所包含的元素的个数*/
- #include <stdio.h>
- #define N 1000
-
- int a[N+10], n;
- int ans[N+10], tree[N+10];
- void update(int x, int value);
- int getsum(int x);
-
- int main()
- {
- int i, j;
-
- scanf("%d", &n);
- for (i = 1; i <= n; i++)
- scanf("%d", &a[i]);
- /*核心部分*/
- for (i = 1; i <= n; i++) {
- /*如果是统计位置i右边小于a[i]的个数
- 循环改写为for (i = n; i >= 1; i--)即可*/
- ans[i] = getsum(a[i]);
- update(a[i], 1);
- }
-
- for (i = 1; i <= n; i++)
- printf("%d ", ans[i]);
- printf("\n");
-
- return 0;
- }
-
- void update(int x, int value)
- {
- while (x <= N) {
- tree[x] += value;
- x += x & (-x);
- }
- return
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。