首页 > 代码库 > hoj 2275 Number sequence
hoj 2275 Number sequence
Number sequence
Given a number sequence which has N element(s), please calculate the number of different collocation for three number Ai, Aj, Ak, which satisfy that Ai < Aj > Ak and i < j < k.
Input
The first line is an integer N (N <= 50000). The second line contains N integer(s): A1, A2, ..., An(0 <= Ai <= 32768).
Output
There is only one number, which is the the number of different collocation.
Sample Input
5
1 2 3 4 1
Sample Output
6
题目就是统计序列中Ai < Aj > Ak(i < j < k)的个数,可以从前往后统计每个元素之前小于它的数的个数,在从后往前统计每个元素之后小于它的数的个数。然后乘积加和即可。用树状数组轻松搞定!!
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #define M 50010 using namespace std; int c[M],num[M]; int l[M],n; int lowbit(int a) { return a&-a; } void add(int a,int b) { while (a<M) { c[a]+=b; a+=lowbit (a); } } int sum(int a) { int ans=0; while(a>0) { ans+=c[a]; a-=lowbit(a); } return ans; } int main () { int i,j; int a,b; while(~scanf("%d",&n)) { memset(c,0,sizeof c); memset(num,0,sizeof num); for(i=1;i<=n;i++) { scanf("%d",&num[i]); l[i]=sum(num[i]-1); add(num[i],1); } memset(c,0,sizeof c); long long ans=0; for(i=n;i>=1;i--) { ans=ans+(long long)sum(num[i]-1)*l[i]; add(num[i],1); } printf("%lld\n",ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。