洛谷 P2717 寒假作業
阿新 • • 發佈:2018-03-04
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; inta[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 寒假作業