World is Exploding
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 566 Accepted Submission(s): 263
Problem Description
Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d.
Input
The input consists of multiple test cases.
Each test case begin with an integer n in a single line.
The next line contains n integers A1,A2⋯An.
1≤n≤50000
0≤Ai≤1e9
Each test case begin with an integer n in a single line.
The next line contains n integers A1,A2⋯An.
1≤n≤50000
0≤Ai≤1e9
Output
For each test case,output a line contains an integer.
Sample Input
4
2 4 1 3
4
1 2 3 4
Sample Output
1
0
Author
ZSTU
思路:找每个数的前面比他小的个数a[i],和前面比他大的个数,和后面比他小的b[i],和后面比他大的,这个用树状数组求,然后总的个数就是sum(a[i])*sum(b[i]);
然后就是去掉不合情况的,那么就是三个点有一个点是重合的,那么考虑每个节点,就是前面比他小的*后面比他小的,前面比他大的*后面后面比他大的,前面比他小的*前面比他大的,后面比他大的*后面比他小的。
复杂度(n*longn)
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <iostream> 6 #include <algorithm> 7 #include <map> 8 #include <queue> 9 #include <vector> 10 #include<set> 11 using namespace std; 12 typedef long long LL; 13 typedef struct pp 14 { 15 int x; 16 int id; 17 } ss; 18 bool cmp(pp p,pp q) 19 { 20 return p.x<q.x; 21 } 22 int uu[6000]; 23 ss dd[60000]; 24 int a[60000]; 25 LL zbit[60000]; 26 LL ybit[60000]; 27 int zz[60000]; 28 int yy[60000]; 29 int zz1[60000]; 30 int yy1[60000]; 31 int sumz(int i); 32 void addz(int i,int x,int t); 33 int sumy(int i); 34 void addy(int i,int x,int t); 35 int main(void) 36 { 37 LL i,j,k; 38 while(scanf("%lld",&k)!=EOF) 39 { 40 for(i=0; i<k; i++) 41 { 42 scanf("%d",&dd[i].x); 43 dd[i].id=i; 44 } 45 memset(zbit,0,sizeof(zbit)); 46 memset(ybit,0,sizeof(ybit)); 47 sort(dd,dd+k,cmp); 48 int id=1; 49 int ak=dd[0].x; 50 a[dd[0].id]=id; 51 for(i=1; i<k; i++) 52 { 53 if(ak!=dd[i].x) 54 { 55 id++; 56 ak=dd[i].x; 57 } 58 a[dd[i].id]=id; 59 } 60 for(i=0; i<k; i++) 61 { 62 LL ask=sumz(a[i]-1); 63 zz[i]=ask; 64 zz1[i]=i-sumz(a[i]); 65 addz(a[i],1,id); 66 } 67 for(i=k-1; i>=0; i--) 68 { 69 LL ask=sumy(a[i]-1); 70 yy[i]=ask; 71 yy1[i]=(k-i-1)-sumy(a[i]); 72 addy(a[i],1,id); 73 } 74 LL qian=0; 75 LL hou=0; 76 for(i=0; i<k; i++) 77 { 78 qian+=zz[i]; 79 hou+=yy[i]; 80 } 81 LL sum=qian*hou; 82 for(i=0; i<k; i++) 83 { 84 sum-=(LL)(zz[i])*(LL)(yy[i])+(LL)(zz[i])*(LL)(zz1[i])+(LL)(yy[i])*(LL)(yy1[i])+(LL)(zz1[i])*(LL)(yy1[i]); 85 } 86 printf("%lld ",sum); 87 } 88 return 0; 89 } 90 int sumz(int i) 91 { 92 int s=0; 93 while(i>0) 94 { 95 s+=zbit[i]; 96 i-=i&(-i); 97 } 98 return s; 99 } 100 void addz(int i,int x,int t) 101 { 102 while(i<=t) 103 { 104 zbit[i]+=x; 105 i+=i&(-i); 106 } 107 } 108 int sumy(int i) 109 { 110 int s=0; 111 while(i>0) 112 { 113 s+=ybit[i]; 114 i-=i&(-i); 115 } 116 return s; 117 } 118 void addy(int i,int x,int t) 119 { 120 while(i<=t) 121 { 122 ybit[i]+=x; 123 i+=i&(-i); 124 } 125 }