题目描述

有一天,小$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. Fedora 的截屏功能

    写写博客少不了截图,Windows 上使用微信的快捷键 Ctrl+A 截图并且可以随意编辑是挺方便的,开始在 Linux 上还没有找到这样的软件,只找到了不支持编辑的简单截图软件. 1. 使用 Scr ...

  2. Python笔记(十三)_os模块和os.path模块

    os模块中关于文件/目录常用的函数使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当前目录,' ...

  3. C#后台去除字符串最后一个字符

    string str = "a,b,c,"; int length = str.length; //获取字符串长度 str = str.substring(0,length-1); ...

  4. oracle创建sequence序列语法

    在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系 1.create sequence create sequence SEQ_LOG_ID minval ...

  5. Map与JSON Conver

    function strMapToObj(strMap) {     let obj = Object.create(null);     for (let [k,v] of strMap) {    ...

  6. [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243 线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色 ...

  7. 洛谷 P1168 中位数(优先队列)

    题目链接 https://www.luogu.org/problemnew/show/P1168 解题思路 这个题就是求中位数,但是暴力会tle,所以我们用一种O(nlogn)的算法来实现. 这里用到 ...

  8. BZOJ 3703: 昊昊的壮举之造福社会

    传送门 搜索,剪枝 首先可以二分答案迭代加深,假设要买 $p$ 台 那么肯定卖价格最小的 $p$ 台 再来个 $A*$ ,设搜到当前情况时,有 $waste$ 的钱一定要被浪费(其实就是某些学校剩下的 ...

  9. 利用java反射动态调用方法,生成grid数据

    项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...

  10. elementUI 导航栏点击之后改变背景色,背景色悬停

    一开始设置的是: .menuLeft .el-menu-item:hover{ background: #6db6ff !important; } .menuLeft .el-submenu__tit ...