zoukankan      html  css  js  c++  java
  • AtCoder

    Problem Statement

    You are given an integer sequence of length Na= {a1,a2,…,aN}, and an integer K.

    a has N(N+1)⁄2 non-empty contiguous subsequences, {al,al+1,…,ar(1≤lrN). Among them, how many have an arithmetic mean that is greater than or equal to K?

    Constraints

    • All input values are integers.
    • 1≤N≤2×105
    • 1≤K≤109
    • 1≤ai≤109

    Input

    Input is given from Standard Input in the following format:

    N K
    a1
    a2
    :
    aN
    

    Output

    Print the number of the non-empty contiguous subsequences with an arithmetic mean that is greater than or equal to K.

    Sample Input 1

    3 6
    7
    5
    7
    

    Sample Output 1

    5
    

    All the non-empty contiguous subsequences of a are listed below:

    • {a1} = {7}
    • {a1,a2} = {7,5}
    • {a1,a2,a3} = {7,5,7}
    • {a2} = {5}
    • {a2,a3} = {5,7}
    • {a3} = {7}

    Their means are 7619⁄356 and 7, respectively, and five among them are 6or greater. Note that {a1} and {a3} are indistinguishable by the values of their elements, but we count them individually.

    Sample Input 2

    1 2
    1
    

    Sample Output 2

    0
    

    Sample Input 3

    7 26
    10
    20
    30
    40
    30
    20
    10
    

    Sample Output 3

    13


    树状数组sb题。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=200005;
    ll num[maxn],a[maxn],ans;
    int n,r[maxn],f[maxn],k,ky;
    inline int read(){
    	int x=0; char ch=getchar();
    	for(;!isdigit(ch);ch=getchar());
    	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    	return x;
    }
    inline void update(int x,int y){ for(;x<=ky;x+=x&-x) f[x]+=y;}
    inline int query(int x){ int an=0; for(;x;x-=x&-x) an+=f[x]; return an;}
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;i++) a[i]=read()-k;
    	for(int i=1;i<=n;i++){
    	    a[i]+=a[i-1],num[i]=a[i];
    	    if(a[i]>=0) ans++;
    	}
    	sort(num+1,num+n+1);
    	ky=unique(num+1,num+n+1)-num-1;
    	for(int i=1;i<=n;i++) r[i]=lower_bound(num+1,num+ky+1,a[i])-num;
    	for(int i=1;i<=n;i++) ans+=(ll)query(r[i]),update(r[i],1);
    	printf("%lld
    ",ans);
    	return 0;
    }
    

      

     
  • 相关阅读:
    Java Json 数据下划线与驼峰格式进行相互转换
    php 将数组转换网址URL参数
    Swagger2常用注解及其说明 (转)
    Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)
    bootstrap.css.map 404
    Git发生SSL certificate problem: certificate ha错误的解决方法
    防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机
    PhpStorm本地断点调试
    Java语言中姐种遍历List的方法总结
    Ubuntu18.04安装mysql5.7
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8921882.html
Copyright © 2011-2022 走看看