HOJ 2275 Number sequence(树状数组) 大于小于问题
2017-10-21 13:41
453 查看
题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai < Aj > Ak 且 i < j < k这样的三个数为一组。求出一共有多少组。
要建立两次树状数组。
首先,我们插入数据进入树状数组时,用一个tmp1数组来记录每个数前面有几个小于它的。这样就保存了 Ai
< Aj 的数量了。
之后我们清空数组,再倒着插入一次,用tmp2数据记录每个数前面有几个小于它的。这样保证了Aj
> Ak的数量了。
我们一乘即可
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define M 35000
#define N 50050
#define ll long long
#define lowbit(x) (x&-x)
int tree[M];
int num
;
ll tmp
;
int sum(int rt)
{
int s=0;
while(rt>0){
s+=tree[rt];
rt-=lowbit(rt);
}
return s;
}
void update(int rt)
{
while(rt<=M-1){
tree[rt]++;
rt+=lowbit(rt);
}
}
int main()
{
int n;
while(~scanf("%d",&n)){
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
num[i]++;
}
ll ans=0;
for(int i=1;i<=n;i++){
tmp[i]= sum(num[i]-1);
update(num[i]);
}
memset(tree,0,sizeof(tree));
for(int i=n;i>=1;i--)
{
ans+=tmp[i]*(ll)sum(num[i]-1);
update(num[i]);
}
printf("%lld\n",ans);
}
return 0;
}
要建立两次树状数组。
首先,我们插入数据进入树状数组时,用一个tmp1数组来记录每个数前面有几个小于它的。这样就保存了 Ai
< Aj 的数量了。
之后我们清空数组,再倒着插入一次,用tmp2数据记录每个数前面有几个小于它的。这样保证了Aj
> Ak的数量了。
我们一乘即可
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define M 35000
#define N 50050
#define ll long long
#define lowbit(x) (x&-x)
int tree[M];
int num
;
ll tmp
;
int sum(int rt)
{
int s=0;
while(rt>0){
s+=tree[rt];
rt-=lowbit(rt);
}
return s;
}
void update(int rt)
{
while(rt<=M-1){
tree[rt]++;
rt+=lowbit(rt);
}
}
int main()
{
int n;
while(~scanf("%d",&n)){
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
num[i]++;
}
ll ans=0;
for(int i=1;i<=n;i++){
tmp[i]= sum(num[i]-1);
update(num[i]);
}
memset(tree,0,sizeof(tree));
for(int i=n;i>=1;i--)
{
ans+=tmp[i]*(ll)sum(num[i]-1);
update(num[i]);
}
printf("%lld\n",ans);
}
return 0;
}
相关文章推荐
- 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)树状数组
- hoj 2275 树状数组 水··不能int 64
- [面试] 在数组查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
- 彻底解决!无效的 CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题
- 北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)
- 定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- 在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
- 面试--求数组,左边的数都小于等于它,右边的数都大于等于它
- hoj 1867 经理的烦恼 (树状数组)
- 将数组中所有小于或等于0的元素都放在数组前面,大于0的元素放在数组后面
- 关于使用datagrid出现的CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题
- 在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
- 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数