【 问题描述】
有一天, 小 A 得到了一个长度为 n 的序列。
他把这个序列的所有连续子序列都列了出来, 并对每一个子序列
都求了其平均值, 然后他把这些平均值写在纸上, 并对它们进行排序,
最后他报出了第 k 小的平均值。
你要做的就是模仿他的过程。
【 输入格式】
第一行两个整数 n,k, 意义如题中所述。
第二行 n 个正整数, 即为小 A 得到的序列。
【 输出格式】
一行一个实数, 表示第 k 小的平均值, 保留到小数点后 4 位。
【 样例输入输出】

ave.in ave.out
6 10
3 5 4 6 1 2
3.6667

【 数据范围与约定】
对于 40%的数据, n≤1000
对于 100%的数据, n≤100000, k≤n*(n+1)/2, 序列中的数≤109

/*
第 k 大不易直接求, 我们想到二分, 则原问题转变为求区间平均
值小于 x 的区间数量。 考虑把序列中的每个数减去 x, 则我们只需求
区间和小于 0 的区间数量。 我们对这个序列求前缀和, 则区间[l,r]和
小于 0 当且仅当 Sl-1> Sr , 答案即为前缀和序列 S 的逆序对数量, 使
用经典的归并排序即可解决, 时间复杂度 O(nlog2n)。
*/
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
typedef double db;
typedef long long ll;
const int N=;
const db eps=1e-;
db b[N],c[N];
int a[N];
ll ans=;
int n;
void solve(int l,int r){
if(l==r) return;
int M=l+r>>;
solve(l,M);solve(M+,r);
int i=l,j=M+,k=l-;
while(i<=M&&j<=r){
if(b[i]<b[j]) c[++k]=b[i++];
else c[++k]=b[j++],ans+=M-i+;
}
while(i<=M) c[++k]=b[i++];
while(j<=r) c[++k]=b[j++];
for(i=l;i<=r;i++) b[i]=c[i];
}
ll calc(db x){
b[]=;
for(int i=;i<=n;i++) b[i]=a[i]-x+b[i-];
ans=;
solve(,n);
return ans;
}
int main(){
freopen("ave.in","r",stdin);
freopen("ave.out","w",stdout);
int mx=,i;
db lb,rb,mid;
ll x;
scanf("%d %lld",&n,&x);
for(i=;i<=n;i++) scanf("%d",&a[i]),mx=max(mx,a[i]);
lb=;rb=mx;
while(rb-lb>eps){
mid=(lb+rb)/;
if(calc(mid)<x) lb=mid;
else rb=mid;
}
printf("%.4lf\n",lb);
return ;
}

LYDSY模拟赛day3 平均数的更多相关文章

  1. LYDSY模拟赛day3 序列

    NOIP不考可持久,弃坑

  2. LYDSY模拟赛day3 涂色游戏

    /* 非常好的题 */ #include <cstdio> #include <iostream> #include <cstdlib> #include < ...

  3. 【2018.10.20】noip模拟赛Day3 飞行时间

    今天模拟赛题目 纯考输入的傻逼题,用$scanf$用到思想僵化的我最终成功被$if$大法爆$0$了(这题只有一组$100$分数据). 输入后面那个$(+1/2)$很难$if$判断,所以我们要判两个字符 ...

  4. LYDSY模拟赛day9 2048

    /* 大模拟题,做的时候思路还是比较清晰的 */ #include<iostream> #include<cstdio> #include<string> #inc ...

  5. LYDSY模拟赛day1 String Master

    /* 暴力枚举两个后缀,计算最长能匹配多少前缀. 最优策略一定是贪心改掉前 k 个失配的字符. 时间复杂度 O(n3). */ #include<cstdio> ],b[]; int ma ...

  6. LYDSY模拟赛day1 Tourist Attractions

    /* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...

  7. LYDSY模拟赛day1 Walk

    /* 依旧考虑新增 2^20 个点. i 只需要向 i 去掉某一位的 1 的点连边. 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可. ...

  8. LYDSY模拟赛day2 Divisors

    /* 注意分解质因数,如果i是,那么n/i也是,这样就可以解决分解质因数的时间问题了 当 k ≥ 1 时,只有这些数的约数才会对答案产生贡献. 求出 m 个数的所有不超过 n 的约数,去重后统计即可. ...

  9. LYDSY模拟赛day2 Market

    /* orz claris,这个题的解法非常巧妙,首先是时间问题,其实这个问题只要离线处理一下就可以了,把物品和询问都按照时间排序,然后看一下能不能满足.然后,因为容量<=10^9,显然是不可能 ...

随机推荐

  1. Linux 开机 logo 修改

    从内核被解压到文件系统被挂载,我们看到的经典画面是一个小企鹅.如果嫌小企鹅枯燥,我们可以把它换掉. 1. 准备图片 这里需要的是 ppm 图片,所以,我们需要把常见格式给转换为 .ppm 才能使用.c ...

  2. 用python来调试网络程序

    需要联调的程序,沟通联调起来总是各种麻烦,如果自己能写个简单一点的“测试机”,事情就很easy了:或者有时候想做“中间人”,看看网路上到底传些什么.前面写了串口的测试机,今天尝试了一下UDP的. im ...

  3. 拼装query的sql语句

    com.kingdee.bos.metadata.query.util.QuerySqlAccessBase //打开一个绑定query界面,获取query查询的最终sql,231行

  4. Web 使用PostMan提交特殊格式数据

    使用PostMan 选择POST模式中的RAW模式 然后点击Headers添加Content-Type 类型比如是 application/json 然后就可以在body中以Json格式上传数据了 前 ...

  5. C#中值类型和引用类型图解

    举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...

  6. mysql select 格式化输出

    select * from test\G; MySQL的客户端命令行工具,有很多方便使用者的特性,某些方面甚至可以说比Oracle的sqlplus更加人性化.当然从整体来说,还是sqlplus更加方便 ...

  7. QT的安装和配置及helloqt程序的编写时遇到的问题

    1.如果在Windows下命令行编译和运行.cpp 文件,需要找到合适的命令所在文件夹的目录,把它添加到Windows的环境变量里去,SystemPropertiesAdvance. 如qmake 在 ...

  8. vm centos 添加网卡 无配置文件

    vm centos 添加网卡 无配置文件 解决办法 [root@test ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:C8:41:FB ...

  9. 关于软件工程个人作业 Word frequency program 的总结

    一.预计花在程序各部分的时间: (1)对所给命令行参数的判断和处理,看它是否合法.是哪种模式.预计用时20min; (2)关于目录操作:遍历给定目录下的所有文件,包括子目录和非目录文件.预计用时40m ...

  10. Linux版MonoDevelop无法连接调试器的解决方案(Could not connet to the debugger)

    安装了Linux版本的MonoDevelop之后,在运行程序的时候会提示Could not connnet to the debugger.的错误. 原因是新版本的Gnome Terminal不再接受 ...