zoukankan      html  css  js  c++  java
  • 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
    ",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 }
    油!油!you@
  • 相关阅读:
    sed 删除最后几行 和删除指定行 awk使用
    nagios监控
    nginx服务启动脚本
    Linux修改环境变量的4种方法
    源码编译apache报错的解决方法
    apache源码安装及启动脚本添加
    haproxy配置
    awk命令2
    awk命令1
    通配符及变量
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5733309.html
Copyright © 2011-2022 走看看