World is Exploding(hdu5792)

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: abcd,1a<bn,1c<dn,Aa<Ab,Ac>Ad.
 

 

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,A2An.
1n50000
0Ai1e9
 

 

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\n",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 }

 

posted @ 2016-08-03 16:06  sCjTyC  阅读(243)  评论(0编辑  收藏  举报