hdu 5147 Sequence II
2015-01-02 19:29
351 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5147
题意:问有多少个这样的四元组(a,b,c,d),满足条件是 1<=a<b<c<d; Aa<Ab; Ac<Ad;
思路:用树状数组求,从右向左求在这个数之前形成多少个逆序数对记录在r数组里面,然后在从左向右求出在输入这个数之前形成多少个逆序数对存在l数组里面,然后枚举b就行;
View Code
题意:问有多少个这样的四元组(a,b,c,d),满足条件是 1<=a<b<c<d; Aa<Ab; Ac<Ad;
思路:用树状数组求,从右向左求在这个数之前形成多少个逆序数对记录在r数组里面,然后在从左向右求出在输入这个数之前形成多少个逆序数对存在l数组里面,然后枚举b就行;
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 50001 #define ll long long using namespace std; int t; int n; int a[maxn]; int c[maxn]; ll l[maxn],r[maxn],sum[maxn]; int lowbit(int x) { return x&-x; } void insert(int x,int v) { while(x<maxn) { c[x]+=v; x+=lowbit(x); } } ll getsum(int x) { ll ans=0; while(x>0) { ans+=c[x]; x-=lowbit(x); } return ans; } int main() { scanf("%d",&t); while(t--) { memset(sum,0,sizeof(sum)); memset(a,0,sizeof(a)); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } memset(c,0,sizeof(c)); sum[n+1]=0; for(int i=n; i>=1; i--) { r[i]=getsum(n)-getsum(a[i]); insert(a[i],1); sum[i]=sum[i+1]+r[i]; } memset(c,0,sizeof(c)); for(int i=1; i<=n; i++) { l[i]=getsum(a[i]-1); insert(a[i],1); } ll ans=0; for(int i=2; i<=n; i++) { ans+=(l[i]*sum[i+1]); } printf("%lld\n",ans); } return 0; }
View Code
相关文章推荐
- 杭电hdu 5147 Sequence II (树状数组)
- Hdu 5147 Sequence II(树状数字 or 线段树 + 输入外挂 前缀和+后缀和)
- hdu 5147 Sequence II(树状数组)
- hdu 5147 Sequence II(树状数组,前缀和,后缀和)
- HDU 5147 Sequence II ( 树状数组 )
- HDU_5147 Sequence II [逆序数]
- hdu 5147 Sequence II
- HDU 5147 Sequence II
- hdu 5147 Sequence II(前缀和,后缀和)
- HDU 5147 Sequence II 【树状数组维护信息 + 后缀和思想】
- hdu 5147 Sequence II (树状数组 求逆序数)
- [HDU 5147] Sequence II (树状数组+前缀和)
- HDU 5147 Sequence II 树状数组
- HDU 5147 Sequence II (线段树求前缀和、后缀和)
- hdu 5147 Sequence II 树状数组
- [ACM] hdu 5147 Sequence II (树状数组,前缀和,后缀和)
- hdu 5147 Sequence II(树状数组)
- hdu 5147——Sequence II
- 【CUGBACM15级BC第23场 B】hdu 5147 Sequence II
- HDU 5147 BestCoder #23(树状数组区间 前缀和,后缀和)类似LA4329