【洛谷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...... 我永远只会有最直 ...
随机推荐
- shiro权限控制的简单实现
权限控制常用的有shiro.spring security,两者相比较,各有优缺点,此篇文章以shiro为例,实现系统的权限控制. 一.数据库的设计 简单的五张表,用户.角色.权限及关联表: CREA ...
- iOS图片轮播
基于ScrollView的图片播放 ScrollView的方法 NSTime的循环 UIPageControl的运用 委托方法 基于iphone5 未做屏幕的适配 import "ViewC ...
- 【linux之shell脚本】
一.简介 机器语言汇编语言高级语言 面向过程 C Shell Perl 面向对象 java python c++ 强语言:先编译再执行 java c++ 弱语言:边编译边执行 shell python ...
- 升级gitlab
https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update https://about.gitlab.com/update/#cent ...
- CentOS利用Nginx+Docker部署.netcore应用
安装docker 官方文档https://docs.docker.com/engine/installation/linux/docker-ce/centos/ [root@sn ~]# yum re ...
- Spring_Spring与DAO_Spring的Jdbc模板
一.导入Jar包 二.定义实体类与DB表 public class Student { private Integer id; private String name; private int age ...
- 依赖于boodtrap3的插件推荐以及bootrap发展前景
作为一个栅格系统和速度开发的,偏向于框架,bootstrap出来很火,为了节省效率,不少公司选用这个框架进行开发,一同被发现的是依赖于bootrap各种插件的adminLTE的集成模版,但是前端框架日 ...
- Shell 编程入门
首先创建一个文件: 在终端中输入如下命令: vi helloworld.sh 然后按i进行命令编写 下面这句话是必须写的 #!/bin/sh这句话是必须写的 #!/bin/sh a="hel ...
- SQLSERVER中分割字符串成多列
今天修改到之前的大佬的代码,居然把多个Id存在一个列里面,还是用的逗号分割...特么查询的时候怎么办??? 网上搜索了半天,终于找到了SqlServer里面有一个PARSENAME函数,可以按.(点) ...
- HDU - 1248 寒冰王座 数学or暴力枚举
思路: 1.暴力枚举每种面值的张数,将可以花光的钱记录下来.每次判断n是否能够用光,能则输出0,不能则向更少金额寻找是否有能够花光的.时间复杂度O(n) 2.350 = 200 + 150,买350的 ...