【洛谷T7153】(考试) 中位数
题目描述
给定 n 个数 a1, a2, ..., an,求这 n 个数两两的差值(共 n(n−1)
2 个)的中位数。
输入格式:
第一行一个正整数 n,表示数的个数。
接下来一行 n 个正整数,分别为 a1, a2, ..., an。
输出格式:
一行一个数表示差值的中位数。
输入输出样例
输入样例#1:
3
4 2 6
输出样例#1:
2
题解
这里貌似没有数据范围。。。。
好吧
我补一下。。
30%数据保证O(n^2)能出解
100%数据n<=2000000,且结果是整数
首先,我们来看看30大暴力
依次求出所有的差(O(n^2))
排序,求解
但是,正解是啥?
先提前剧透一下:二分
我们每次二分出一个值(中位数)
然后判断是否可行
如何判断?首先对所有数进行一次排序
接着,从当前数开始
计算一下加上中位数后比它小的数的个数
最后,统计一下加了几个数
如果 大于/小于 了数字差的数量的一半 就想 小/大 的地方继续二分
这样求完。。。发现,,还是有点问题。。
的确,
中位数要么是一个数列中的值,
要么是两个数的平均值
所以,要求出两个中位数并且计算它们的平均值即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
#define MAX 2000100
ll n;
ll a[MAX];
ll tot;
ll ans;
inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
sort(&a[1],&a[n+1]);
tot=(ll)(n-1)*n/2;
ll L=0,R=a[n]-a[1];
while(L<R)//二分找答案
{
ll mid=(L+R)>>1;
ll tt=0,pp=1;
for(int i=1;i<=n;++i)
{
while(a[pp]<=a[i]+mid&&pp<=n)++pp;
tt+=n-pp+1;
}
if(tt*2>tot)L=mid+1;
else R=mid;
}
ans=R;
L=0;R=a[n]-a[1];
while(L<R)//中位数可能是两个的平均数,所以要二分两次
{
ll mid=(L+R)>>1;
ll tt=0,pp=1;
for(int i=1;i<=n;++i)
{
while(a[pp]<=a[i]+mid&&pp<=n)++pp;
tt+=n-pp+1;
}
if(tt*2>=tot)L=mid+1;
else R=mid;
}
cout<<((ans+R)>>1)<<endl;
return 0;
}
【洛谷T7153】(考试) 中位数的更多相关文章
- 洛谷 P3871 [TJOI2010]中位数 解题报告
P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...
- 洛谷 P1627 [CQOI2009]中位数 解题报告
P1627 [CQOI2009]中位数 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式 ...
- 洛谷P3871 [TJOI2010]中位数(splay)
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- 洛谷——P1627 [CQOI2009]中位数
P1627 [CQOI2009]中位数 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 中位数的题目有关统计的话,可以转 ...
- 洛谷 3871 [TJOI2010]中位数
[题解] 平衡树模板题,不过因为可以离线,所以有别的做法.把询问倒着做,变成删掉数字.求中位数,于是可以二分+树状数组. #include<cstdio> #include<cstr ...
- 洛谷——P3871 [TJOI2010]中位数
P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...
- 洛谷3871 [TJOI2010]中位数 维护队列的中位数
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- 洛谷模拟NOIP考试反思
洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
随机推荐
- 读书共享 Primer Plus C-part11
第十四章结构和其他数据形式 关于fread以及fwrite fread(char* buff,int size,int count,FILE* fp) fwrite(char* buff,int si ...
- hiveql笔记(一)
1.创建表 create table if not exists mydb.employees{ name String COMMENT 'Employee name', salary FLOAT C ...
- Sourcetree的安装与使用
1 安装遇到的问题 https://segmentfault.com/q/1010000007643870 解决该问题的方法: http://www.jianshu.com/p/3478e2a214a ...
- 【NOIP2012】 疫情控制
[NOIP2012] 疫情控制 标签: 倍增 贪心 二分答案 NOIP Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...
- CSS布局(四) float详解
一.float设计初衷 因为float被设计出来的初衷是用于--文字环绕效果.即,一个图片一段文字,图片float:left之后,文字会环绕图片. <div style="width: ...
- Yii2 Ajax Post 实例及常见错误修正
先贴下我的代码: signup.js$('.reg_verify_pic').click(function(){ var csrfToken = $('meta[name="_csrf-To ...
- AssetBundle实现服务器下载并从本地读取
废话不多说 直接上代码. 从服务器下载的, 很简单 private IEnumerator Start() { byte[] ab = null; int len = 0; WWW www =nul ...
- 理解 Git
Git 如何保存文件 其它版本管理系统通常会保存所有文件及其历次提交的差异(diff / revision),通过 merge 原始文件与各阶段的差异就能获取任何版本的状态 而 Git 保存的是每一次 ...
- ActiveMq笔记2-消息持久化
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB, 无论使用哪种持久化方 ...
- nodejs之socket.io模块——实现了websocket协议
Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,主要使用的是sock ...