51nod1711 平均数

Description

LYK有一个长度为n的序列a。

他最近在研究平均数。

他甚至想知道所有区间的平均数,但是区间数目实在太多了。

为了方便起见,你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了。

Input

第一行两个数n,k(1<=n<=100000,1<=k<=n*(n+1)/2)。接下来一行n个数表示LYK的区间(1<=ai<=100000)。

Output

一行表示第k大的平均数,误差不超过1e-4就算正确。

Input示例

5 31 2 3 4 5

Output示例

4.000

思路

首先看题目求区间第k大,首先想到分第k大的平均数x。问题转化为如何快速求任意区间的平均数大于x的个数,先求求前缀和,则可以表示为(sum[r] - sum[l-1])/(r - l +1) > x 的区间个数,转化一下即为sum[r] - r*x > sum[l-1] - (l-1) * x;即形成一个新的数组sum[i]- i * x,求满足条件的区间有多少个,离散化一下,用树状数组统计一下就行。

注意:i从0开始,sum[0] = 0;也要算进去,不然会把0-1的区间漏掉。

Code

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MAXN 100010
 5 typedef long long ll;
 6 using namespace std;
 7 ll sum[MAXN];
 8 double a[MAXN],b[MAXN];
 9 int tree[MAXN];
10 int n;
11 ll k;
12
13 int lowbit( int x)
14 {
15     return x & -x;
16 }
17 void add(int k)
18 {
19     while(k <= n + 1)
20     {
21         tree[k] ++;
22         k += lowbit(k);
23     }
24 }
25 int Sum(int k)
26 {
27     int sum = 0;
28     while(k)
29     {
30         sum += tree[k];
31         k -= lowbit(k);
32     }
33     return sum;
34 }
35 long long check(double x)
36 {
37     memset(tree, 0, sizeof(tree));
38     for(int i = 0; i <= n; i++)
39         a[i] = b[i] = sum[i] - i * x;
40     sort(a, a + 1 + n);
41     int num = unique(a, a + 1 + n) - a;
42     long long ans = 0;
43     for(int i = 0; i <= n; i++)
44     {
45         int temp = lower_bound(a, a + num, b[i]) - a + 1;
46         ans += Sum(temp);
47         add(temp);
48     }
49     return ans;
50 }
51 int main()
52 {
53     scanf("%d%I64d",&n,&k);
54     int temp;
55     sum[0] = 0;
56     for(int i =  1; i <= n; i++)
57     {
58         scanf("%d",&temp);
59         sum[i] = sum[i - 1] + temp;
60     }
61     double l = 1.0, r = 100000.0;
62     while(r - l >= 1e-6)
63     {
64         double mid = (l + r) / 2.0;
65         if (check(mid) >= k)
66             l = mid;
67         else
68             r = mid;
69     }
70     printf("%.4f\n",(r + l)/2.0);
71     return 0;
72 }
时间: 2024-10-06 00:06:59

51nod1711 平均数的相关文章

C/C++算法竞赛入门经典Page15 习题1-1 平均数

题目:输入3个整数,输出他们的平均值,保留3位小数. 首先,声明三个整数a,b,c和一个浮点数d: int a,b,c; double d; 输入三个整数a,b,c: scanf("%d%d%d",&a,&b,&c); 将a,b,c取平均值以后复制给d: d=(double)(a+b+c)/3; 最后输出d: printf("%.3lf",d); %.3lf表示保留3位小数的long float. 注意:不能直接这样输出: printf(&q

codevs 1389 乘积平均数

1389 乘积平均数 题目描述 Description 定义 n 个数的乘积平均数为这 n 个数的乘积开 n 次方.给定 n 个正整数,求它们的乘积平均数. 给定n 个正整数,求它们的乘积平均数. 输入描述 Input Description 第一行,一个数 n接下来一行 n 个数,表示给定的 n 个数 输出描述 Output Description 一个实数,表示给定数的乘积平均数,保留2 位小数输出 样例输入 Sample Input 22 8 样例输出 Sample Output 4.00

51nod 平均数(马拉松14)

平均数 alpq654321 (命题人) 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了方便起见,你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了. Input 第一行两个数n,k(1<=n<=100000,1<=k<=n*(n+1)/2). 接下来一行n个数表示LYK的区间(1<=ai<=100000). Outp

求多个四元数的平均数

最近要对前几帧数据进行平均数采样.所以又造了一个轮子 此方法经过一些单数和双数的基本测试,除了无效四元数这种特殊情况. Quaternion Average(Quaternion[] quatArray) { var result = new Quaternion(); var count = quatArray.Length; var error = 0; while (count > 1) { if (error >= 10000) break; error++; var k = 0; f

51nod 平均数(二分+树状数组)

题目链接: 平均数 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了方便起见,你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了. Input 第一行两个数n,k(1<=n<=100000,1<=k<=n*(n+1)/2). 接下来一行n个数表示LYK的区间(1<=ai<=100000). Output 一行表示第k大的

Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一年……我在博客园-_-#,希望用dt的代码燃烧脑细胞,温暖小心窝. 上篇<Hadoop阅读笔记(一)——强大的MapReduce>主要介绍了MapReduce的在大数据集上处理的优势以及运行机制,通过专利数据编写Demo加深了对于MapReduce中输入输出数据结构的细节理解.有了理论上的指导,仍

HUD 2023 求平均数

求平均成绩 Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 61990????Accepted Submission(s): 14860 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. ? ? In

zjut 1179 平均数

平均数  Time Limit:1000MS  Memory Limit:32768K Description: 求若干个整数的平均数. Input: 输入数据含有不多于5组的数据,每组数据由一个整数n(n≤50)打头,表示后面跟着n个整数. Output: 对于每组数据,输出其平均数,精确到小数点后3位,每个平均数应占单独一行. Sample Input: 3 6 5 18 4 1 2 3 4 Sample Output: 9.667 2.500 #include <iostream> us

统计学——平均数

最近在工作中需要用到数据分析,发现上学期间学过的丁点统计学知识基本都遗忘了,于是在网易公开课里找了一门统计学的课程学习,顺便把每次的学习成果记录下来,希望对同样在学习数据分析的小伙伴有所帮助. 首先介绍下平均数.中位数和众数. 一般情况下,我们观察一组数据的平均水平,需要借助于平均数.中位数和众数三个统计量.  (1)平均数 a.算数平均数,一般我们讲的平均数即算数平均数,计算起来很简单,就是将一组数据中所有数据求和后再除以这组数据的个数就能得到.计算公式为: 除此之外还有几何平均数.调和平均数