Sequence II
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 949 Accepted Submission(s): 380
Problem Description
Long long ago, there is a sequence A with length n. All numbers in this sequence is no smaller than 1 and no bigger than n, and all numbers are different in this sequence.
Please calculate how many quad (a,b,c,d) satisfy:
1. 1≤a<b<c<d≤n
2. A
a
<A
b![]()
3. A
c
<A
d![]()
Please calculate how many quad (a,b,c,d) satisfy:
1. 1≤a<b<c<d≤n
2. A
3. A
Input
The first line contains a single integer T, indicating the number of test cases.
Each test case begins with a line contains an integer n.
The next line follows n integers A
1
,A
2
,…,A
n![]()
.
[Technical Specification]
1 <= T <= 100
1 <= n <= 50000
1 <= A
i![]()
<= n
Each test case begins with a line contains an integer n.
The next line follows n integers A
[Technical Specification]
1 <= T <= 100
1 <= n <= 50000
1 <= A
Output
For each case output one line contains a integer,the number of quad.
Sample Input
1 5 1 3 2 4 5
Sample Output
4利用树状数组 统计第i个数比它小的 和比它大的 再用dp不断累加比小的乘比它大的 就出来了#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int maxn=50010; int a[maxn]; int pre[maxn],suf[maxn]; int n; int c[maxn]; int lowbit(int x) { return x&(-x); } void update(int i,int x) { while(i<=n) { c[i]+=x; i+=lowbit(i); } } int sum(int i) { int s=0; while(i>0) { s+=c[i]; i-=lowbit(i); } return s; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { pre[i]=sum(a[i]); update(a[i],1); } memset(c,0,sizeof(c)); for(int i=n;i>=1;i--) { suf[i]=(n-i)-sum(a[i]); update(a[i],1); } long long ans=0,dp=0; for(int i=1;i<=n-1;i++) { ans+=dp*suf[i]; dp+=pre[i]; } printf("%lld\n",ans); } return 0; }