题目描述

有一天,小$A$得到了一个长度为$n$的序列。
他把这个序列的所有连续子序列都列了出来,并对每一个子序列都求了其平均值,然后他把这些平均值写在纸上,并对它们进行排序,最后他报出了第$k$小的平均值。
你要做的就是模仿他的过程。


输入格式

第一行两个整数$n,k$,意义如题中所述。
第二行$n$个正整数,即为小$A$得到的序列。


输出格式

一行一个实数,表示第$k$小的平均值,保留到小数点后$4$位。


样例

样例输入:

6 10
3 5 4 6 1 2

样例输出:

3.6667


数据范围与提示

对于$40\%$的数据,$n\leqslant 1,000$。
对于$100\%$的数据,$n\leqslant 100,000,k\leqslant \frac{n\times (n+1)}{2}$,序列中的数$\leqslant {10}^9$。


题解

对于答案,我们可以二分,那么现在我们考虑如何$judge$。

我们可以让整个序列都减去我们现在二分的这个答案,然后对其取前缀和,那么如果前缀和上$S_{l-1}>S_r$的化就说明这段的平均值比二分的答案小;而我们现在要求的就是这个前缀和序列的逆序对的数量,可以用归并排序解决。

精度可能会有问题,建议使用$long\ double$。

时间复杂度:$\Theta(n\log^2 n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const long double eps=1e-5;
int n;
long long k;
long double a[100001],b[100001],que[100001];
int merge(int l,int r)
{
if(l==r)return 0;
int mid=(l+r)>>1;
int res=merge(l,mid)+merge(mid+1,r);
int lft=l,rht=mid+1,cnt=l-1;
while(lft<=mid&&rht<=r)
{
if(b[rht]<b[lft])
{
que[++cnt]=b[rht];
res+=mid-lft+1;
rht++;
}
else
{
que[++cnt]=b[lft];
lft++;
}
}
while(lft<=mid){que[++cnt]=b[lft];lft++;}
while(rht<=r){que[++cnt]=b[rht];rht++;}
for(int i=l;i<=r;i++)b[i]=que[i];
return res;
}
bool judge(long double x)
{
for(int i=1;i<=n;i++)
b[i]=a[i]+b[i-1]-x;
int res=merge(0,n);
return res<k;
}
int main()
{
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;i++)scanf("%Lf",&a[i]);
long double lft=0.0,rht=1000000000.0;
while(rht-lft>=eps)
{
long double mid=0.5*(lft+rht);
if(judge(mid))lft=mid;
else rht=mid;
}
printf("%.4Lf",lft);
return 0;
}

rp++

[CSP-S模拟测试]:平均数(二分答案+归并排序)的更多相关文章

  1. 主席树/线段树模拟归并排序+二分答案(好题)——hdu多校第4场08

    用主席树写起来跑的快一点,而且也很傻比,二分答案,即二分那个半径就行 主席树求的是区间<=k的个数 #include<bits/stdc++.h> using namespace s ...

  2. [CSP-S模拟测试]:A(单调栈维护凸包+二分答案)

    题目传送门(内部题150) 输入格式 第一行两个整数$N,Q$. 接下来的$N$行,每行两个整数$a_i,b_i$. 接下来的$Q$行,每行一个整数$x$. 输出格式 对于每个询问,输出一行一个整数表 ...

  3. [CSP-S模拟测试]:maze(二分答案+最短路)

    题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...

  4. [CSP-S模拟测试]:毛三琛(随机化+二分答案)

    题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...

  5. [CSP-S模拟测试]:kill(二分答案+贪心)

    题目传送门(内部题50) 输入格式 第一行包含四个整数$n,m,s$,表示人数.怪物数及任务交付点的位置.第二行包含$n$个整数$p_1,p_2,...,p_n$.第三行包含$n$个整数$q_1,q_ ...

  6. NOIP模拟:能源(二分答案)

    题目描述 小美为了拯救世界能源危机,她准备了 n 台蓄电池.一开始每台蓄电池有 ai 个单位的能量. 现在她想把 n 台蓄电池调整到能量相同.对于每台蓄电池可以给另一台蓄电池传递能量.但是会有能量损耗 ...

  7. Wannafly模拟赛 A.矩阵(二分答案+hash)

    矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两 ...

  8. 【noip模拟赛6】收入计划 最大值的最小值 二分答案

    描述 高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱.从今天起,Matrix67将连续工作N天(1<=N<=100 000).每一天末他可以领取当天及前面若干天里没有领取的工 ...

  9. [校内模拟赛T3]火花灿灿_二分答案_组合数学_贪心

    火花灿灿 题目: 数据范围: 题解: 这个题真的是个神仙题. 我们对于每块石头维护一个$01$串. 这个$01$串的长度是操作次数. 如果$01$串的当前位是$1$,表示这次操作中当前石子被划分到了贡 ...

随机推荐

  1. time in china

    https://www.timeanddate.com/worldclock/china

  2. grpc应用于微服务的分析,基于python

    grpc应用于微服务的分析 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,目前提供 C.Java 和 Go 语言版本,分别是:grpc, grpc-java, g ...

  3. HTMLTestRunner下载生成报告

    HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html,选择HTMLTestRunner.py下载 2.打开显示这 ...

  4. web调试代理工具Whistle

    由于最近在学习微信小程序开发,项目中用到了https代理请求,所以用到了基于Node实现的跨平台web调试代理工具Whistle,在此做一记录. 完成https代理请求总共需要5个步骤. 一.安装No ...

  5. asp.net 连续打印多份HTML页面,出现漏字

    在IE8上打印的内容用了CSS 样式,连续打印多份导致的 可以通过改变CSS样式或更换浏览器解决

  6. spring(四):spring中给bean的属性赋值

    spring中给bean的属性赋值 xml文件properties标签设置 <bean id="student" class="com.enjoy.study.ca ...

  7. elasticsearch 基础 —— Jion父子关系

    前言 由于ES6.X版本以后,每个索引下面只支持单一的类型(type),因此不再支持以下形式的父子关系: PUT /company { "mappings": { "br ...

  8. Linux学习笔记5(2)-CentOS7中Tomcat8修改jvm内存配置

    1.进入tomcat的bin目录,比如我的在 /usr/local/apache-tomcat-8.5.16/bin 2.创建新的文件setenv.sh vi setenv.sh 并在此文件中添加以下 ...

  9. Linux就该这么学06学习笔记

    参考链接:https://www.linuxprobe.com/chapter-06.html 1.一切从“/”开始 Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准( ...

  10. vue,一路走来(16)--本地及手机调试

    闲暇时间记录一下如何绑定域名,实现本地及手机调试的过程.我的是微信开发项目,很多功能及操作都是基于微信来开发的,理所当然的就用到微信开发者工具了. 1.首先打开目录C:\Windows\System3 ...