15880 样例不过求调

普及段 Wrong-Answer

解密游戏

题目ID:15880 (满分100分)

时间限制: 1000ms

空间限制: 65536kB

题目描述

小埋最近在玩一个解密游戏,这个游戏会提供 nn 个数。

我们需要求出:在这 nn 个数里面,有多少个连续的数的平均数大于某个给定的数 MM 。

这个数量可能会很大,所以我们要输出这个数对 10000000071000000007 的取模结果。

请你帮小埋求出结果。

输入格式

输入有两行。第一行为两个数 nn 和 MM 。第二行为 nn 个数。

输出格式

输出的数占一行,即问题的解对 10000000071000000007 取模的结果。

样例

Input 1

4 3 1 5 4 2

Output 1

5

Input 2

4 4 5 2 7 3

Output 2

6

样例解释

对于测试样例1,对于这4个数,有 5 组数字符合要求:{1,5,4},{5},{5,4},{5,4,2},{4}。

数据范围

1<=n<=2∗1051<=n<=2∗105

1<M<=3∗1031<M<=3∗103

所有的数均为正整数且不大于5000

蒟蒻看出:
a[l]+a[l+1]+a[l+2]+…+a[r]
------------------------------------ >m
r-l+1

(a[l]-m)+(a[l+1]-m)+(a[l+2]-m)+...+(a[r]-m)>0

于是:

/*
在前缀和里找顺序对
*/
#include<iostream>
#define mod 1000000007
#define int long long
using namespace std;
int n,m,a[200005],s[200005],ans,tmp[200005];
void merge_sort(int a[],int l,int r){
  if(l>=r)return ;
  int mid=(l+r)/2;
  merge_sort(a,l,mid);
  merge_sort(a,mid+1,r);
  int i=l,j=mid+1,k=l;
  while(i<=mid&&j<=r){
    if(a[i]<=a[j]){
      tmp[k++]=a[i++];
      ans=(ans+r-j+1)%mod;
    }else{
      tmp[k++]=a[j++];
    }
  }
  while(i<=mid)tmp[k++]=a[i++];
  while(j<=r)tmp[k++]=a[j++];
  for(int i=l;i<=r;i++){
    a[i]=tmp[i];
  }
}
signed main(){
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    a[i]-=m;
    s[i]=s[i-1]+a[i];
  }
  merge_sort(s,0,n);
  cout<<ans;
  return 0;
}

可是样例居然不过!!!
怎么回事?
是 归并排序错了 还是 统计错了?
帮我调一下吧求求了!

1 个赞

已自行解决,谢谢。
麻烦封闭回复入口。

解决方案别给自己