[CSP-S模拟测试]:平均数(二分答案+归并排序)
题目描述
有一天,小$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模拟测试]:平均数(二分答案+归并排序)的更多相关文章
- 主席树/线段树模拟归并排序+二分答案(好题)——hdu多校第4场08
用主席树写起来跑的快一点,而且也很傻比,二分答案,即二分那个半径就行 主席树求的是区间<=k的个数 #include<bits/stdc++.h> using namespace s ...
- [CSP-S模拟测试]:A(单调栈维护凸包+二分答案)
题目传送门(内部题150) 输入格式 第一行两个整数$N,Q$. 接下来的$N$行,每行两个整数$a_i,b_i$. 接下来的$Q$行,每行一个整数$x$. 输出格式 对于每个询问,输出一行一个整数表 ...
- [CSP-S模拟测试]:maze(二分答案+最短路)
题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...
- [CSP-S模拟测试]:毛三琛(随机化+二分答案)
题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...
- [CSP-S模拟测试]:kill(二分答案+贪心)
题目传送门(内部题50) 输入格式 第一行包含四个整数$n,m,s$,表示人数.怪物数及任务交付点的位置.第二行包含$n$个整数$p_1,p_2,...,p_n$.第三行包含$n$个整数$q_1,q_ ...
- NOIP模拟:能源(二分答案)
题目描述 小美为了拯救世界能源危机,她准备了 n 台蓄电池.一开始每台蓄电池有 ai 个单位的能量. 现在她想把 n 台蓄电池调整到能量相同.对于每台蓄电池可以给另一台蓄电池传递能量.但是会有能量损耗 ...
- Wannafly模拟赛 A.矩阵(二分答案+hash)
矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两 ...
- 【noip模拟赛6】收入计划 最大值的最小值 二分答案
描述 高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱.从今天起,Matrix67将连续工作N天(1<=N<=100 000).每一天末他可以领取当天及前面若干天里没有领取的工 ...
- [校内模拟赛T3]火花灿灿_二分答案_组合数学_贪心
火花灿灿 题目: 数据范围: 题解: 这个题真的是个神仙题. 我们对于每块石头维护一个$01$串. 这个$01$串的长度是操作次数. 如果$01$串的当前位是$1$,表示这次操作中当前石子被划分到了贡 ...
随机推荐
- Warning: Cannot modify header information原因及解决方案
相信大多数人在写PHP代码的时候,都遇到过类似"Warning: Cannot send session cookie – headers already sent…“或者”Cannot a ...
- debian7下安装eclipse
apt-get install build-essential 完成后从eclipse官网上下载C++专用的版本,直接解压缩即可
- 20190825 On Java8 第十三章 函数式编程
第十三章 函数式编程 函数式编程语言操纵代码片段就像操作数据一样容易. 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许你 ...
- 15.队列Queue的特点以及使用,优先级等
#生产者与消费者模式,模式解释:比如MVC设计模式 ''' 1.队列 (1)特点:先进先出 (2)python2 VS python3 python2:from Queue import queue ...
- 3.创建线程的第二种写法,继承threading.Tread类,重写run方法
#创建线程的第二种写法 #1.自定义一个类 #2.继承Thread #3.重写run()方法 import threading,time,random class MyThread(threading ...
- Action 分离
原文地址:http://www.cnblogs.com/giggle/p/5380832.html?utm_source=tuicool&utm_medium=referral 本处摘要备注. ...
- Swipe-移动端触摸滑动插件swipe.js
原文链接:http://caibaojian.com/swipe.html 插件特色 viaswipe.JS是一个比较有名的触摸滑动插件,它能够处理内容滑动,支持自定义选项,你可以让它自动滚动,控制滚 ...
- vue.js2.0 (简易)水果商城 vuex vant-ui
vue.js2.0 (简易)水果商城 vuex vant-ui:https://segmentfault.com/a/1190000015690250 vue2.5全家桶 高仿vivo商城 百分之95 ...
- 线程休眠只会用 Thread.sleep?来,教你新姿势!
线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行. 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sl ...
- Java并发编程:进程的创建
Java并发编程:进程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...