【洛谷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...... 我永远只会有最直 ...
随机推荐
- mongoDB高级查询$type4array使用解析
今天在使用mongoDB高级查询$type:符号 -- 4代指Array类型发现一个问题. $type符号: $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. 下面是mong ...
- 试着把.net的GC讲清楚(1)
什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...
- 新闻热词:从爬虫到react native应用
背景 由于只想了解当天新增的top热词,减少过多信息干扰,打算做一款app实现这个功能. 架构: 热词抓取 -> mysql <=> nodejs <=> nginx & ...
- MathJax使用指南
MathJax使用指南 SublimePrettyJson Github CSDN-Markdown语法集锦 LaTex 简明教程 在Markdown中输入数学公式(MathJax) MathJax ...
- Bruce Eckel的资源
1 GitHub的技术博客 2 On Java 8 – Bruce Eckel 3 artima_weblogs - Bruce Eckel 4 back issues 5 eckel-oo-prog ...
- netty学习资源收集
Netty学习笔记 Netty In Actions CSDN专栏 一起学Netty-CSDN专栏 Netty In Action中文版
- neo-thinsdk-cs 之 thinWallet 接入私链
neo-thinsdk-cs 之 thinWallet 接入私链 2017年底刚开始接触区块链,目前在被 NEO 折磨. 一开始被官方文档和 NEO-GUI 搞得体无完肤(尤其是传说中的 F12),也 ...
- angularjs MVC、模块化、依赖注入详解
一.MVC <!doctype html> <html ng-app> <head> <meta charset="utf-8"> ...
- Java经典编程题50道之二十四
有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁. 问第三个人,他说比第2人大两岁.问第2个人, 说比第一个人大两岁.最后问第一个人,他说是10岁. 请问 ...
- java6 - 面向对象编程思想
一.学习大纲: 1. 类的理解:对现实事物的抽象表示 2. 行为与特征的理解:在类抽象过程中,通常把行为抽象成方法,把特征抽象成属性 3. 对象的理解:类的一个实例即是对象 4. Object 根类 ...