• HDOJ 5147 Sequence II 树阵



    树阵:

    每个号码的前面维修比其数数少,和大量的这后一种数比他的数字

    再枚举每一个位置组合一下 

    Sequence II

    Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 121    Accepted Submission(s): 58


    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. 1a<b<c<dn
    2. Aa<Ab
    3. Ac<Ad
     

    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 A1,A2,,An.

    [Technical Specification]
    1 <= T <= 100
    1 <= n <= 50000
    1 <= Ai <= n
     

    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
     

    Source
     



    /* ***********************************************
    Author        :CKboss
    Created Time  :2014年12月20日 星期六 21时38分00秒
    File Name     :HDOJ5147.cpp
    ************************************************ */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <cstdlib>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    
    using namespace std;
    
    typedef long long int LL;
    
    const int maxn=55000;
    
    int a[maxn];
    int n;
    
    LL sum1[maxn],sum2[maxn];
    int t1[maxn],t2[maxn];
    
    int lowbit(int x) { return x&(-x); }
    
    /// 1 找比当前数小的 2 找比当前数大的
    
    void init()
    {
    	memset(sum1,0,sizeof(sum1));
    	memset(sum2,0,sizeof(sum2));
    	memset(t1,0,sizeof(t1));
    	memset(t2,0,sizeof(t2));
    }
    
    void add(int kind,int p)
    {
    	if(kind==1) for(int i=p;i<maxn;i+=lowbit(i)) t1[i]+=1;
    	else if(kind==2) for(int i=p;i;i-=lowbit(i)) t2[i]+=1;
    }
    
    int sum(int kind,int p)
    {
    	int ret=0;
    	if(kind==1) for(int i=p;i;i-=lowbit(i)) ret+=t1[i];
    	else if(kind==2) for(int i=p;i<maxn;i+=lowbit(i)) ret+=t2[i];
    	return ret;
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
    
    	int T_T;
    	scanf("%d",&T_T);
    	while(T_T--)
    	{
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++) scanf("%d",a+i);
    
    		init();
    
    		/// from left to right
    		for(int i=1;i<=n;i++)
    		{
    			int ss=sum(1,a[i]);
    			sum1[i]=ss;
    			add(1,a[i]);
    		}
    		/// from right to left
    		for(int i=n;i>=1;i--)
    		{
    			int ss=sum(2,a[i]);
    			sum2[i]=sum2[i+1]+ss;
    			add(2,a[i]);
    		}
    
    		LL ans=0;
    		for(int i=2;i<=n-1;i++)
    		{
    			/// X...i i+1...X
    			ans+=sum1[i]*sum2[i+1];
    		}
    
    		cout<<ans<<endl;
    	}
        
        return 0;
    }
    



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    继承
    类和对象
    Scanner类
    面向对象思想
    final关键字
    The difference between text mode and binary mode with file streams
    Linux下常见权限操作相关命令
    Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext
    手动运行jar包,指定配置文件
    jdk 1.8.0_131 Class JavaLaunchHelper is implemented
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4688631.html
Copyright © 2020-2023  润新知