program

【题目分析】

  题目的意思是在一个数列中找到四个数,a[i]=a[j]<a[k]=a[l],其他都扯淡。

  先把这些数sort一下,所有相等的数字就都排在一起了,然后这个数列可以按照数字的种类划分成一些段,每一段的数字都是相同的(1 1 4 4 5 5 6 12 12 12) ,每一个段和他后面的段都可以组成满足题目条件的答案。而每个段中的选择方式又有len^2种,我们维护一个前缀和数组sum[i]记录从第一段到第i段的每段组合数的和

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int mo=1e9+7;
const int maxn=1e6+10;
int n;
int a[maxn],num[maxn],sum[maxn];
int ans;
int x;
int main()
{
//    freopen("program.in","r",stdin);
//    freopen("program.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
        num[i]=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]!=a[i-1])
            x++;
        num[x]++;
    }
    for(int i=1;i<=x;i++)
        num[i]=(num[i]*num[i])%mo;
    for(int i=1;i<=x;i++)
        sum[i]=sum[i-1]+num[i];
    for(int i=1;i<x;i++)
        ans=(ans+num[i]*(sum[x]-sum[i]))%mo;
    cout<<ans;
    fclose(stdin);fclose(stdout);
    return 0;
}

 

posted @ 2016-10-31 13:01  [lemon]  阅读(327)  评论(0编辑  收藏  举报
……