1. 程式人生 > >洛谷 P2717 寒假作業

洛谷 P2717 寒假作業

esp while -s print gpo pos const std return

題目描述

/*
求區間i(1<=i<=n)到j(i<=j<=n)的平均值大於k的區間個數 
可以先對每個數減去k,再對新得到的數組求前綴和 
如果sum[j]-sum[i-1]>=0,說明i到j區間的數的平均值大於等於k 
移向得sum[j]>=sum[i-1],因為j>=i,所以j>i-1 
也就是對sum求順序對數了 
*/
#include<complex>
#include<cstdio>
using namespace std;
const int N=1e5+7;
int n,k;
long long ans;
int
a[N],tmp[N]; int qread() { int x=0; char ch=getchar(); while(ch<0 || ch>9)ch=getchar(); while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();} return x; } void Msort(int l,int r) { if(l>=r)return; int mid=l+r>>1; Msort(l,mid);Msort(mid+1,r);
int i=l,j=mid+1,cnt=0; while(i<=mid && j<=r) if(a[i]<=a[j]) { tmp[++cnt]=a[i++]; ans+=r-j+1; } else tmp[++cnt]=a[j++]; while(i<=mid)tmp[++cnt]=a[i++]; while(j<=r)tmp[++cnt]=a[j++]; for(int i=1;i<=cnt;i++) a[i
+l-1]=tmp[i]; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) a[i]=qread()-k+a[i-1]; Msort(0,n); printf("%lld\n",ans); return 0; }

洛谷 P2717 寒假作業