void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个序列,然后让你求连续序列和的平均数大于所给的数a

可以先把输入的数减去a,那么就是求连续序列的和大于0即可,接下来把数组suni]就是前i项的和,那么s[j]>s[i]就可以满足

因此就是求sum的逆序数,可以用归并排序来求,直接上代码慢慢看吧.

/*Source Code

Problem: 1285 Username: void 

Run Time: 233MS Memory: 1484K 

Language:C++ JudgeStatus: Accepted */


#include<iostream>
#include<cstdio>
#include<memory.h>
#include<stdio.h>
using namespace std;
const int MAX=100005;
int s[MAX],h[MAX];
int n,a;
long long  ans;
void merge(int l,int m,int r)
{
        int i=l,j=m+1,k=l;
        while(i<=m&&j<=r)
        {
                if(s[i]<s[j])
                {
                        ans+=r-j+1;
                        h[k++]=s[i++];
                }
                else
                {
                        h[k++]=s[j++];
                }
        }
        while(i<=m)
                        h[k++]=s[i++];
        while(j<=r)
                        h[k++]=s[j++];
        for(i=l;i<=r;i++)
                s[i]=h[i];
}
void mergesort(int l,int r)
{
        int m=(l+r)/2;
        if(l<r)
        {
                mergesort(l,m);
                mergesort(m+1,r);
                merge(l,m,r);
        }
}
int main()
{
        int i,j,T;
        scanf("%d",&T);
        while(T--)
        {
                scanf("%d%d",&n,&a);
                s[0]=0;
                ans=0;
                for(i=1;i<=n;i++)
                {
                        scanf("%d",&j);
                        j-=a;
                        
                        s[i]=s[i-1]+j;
                }
                mergesort(0,n);
                printf("%lld\n",ans);
        }
        return 0;
}
posted on 2011-05-11 00:26  void-man  阅读(211)  评论(0)    收藏  举报