<题目链接>

题目大意:

给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数。

解题分析:

由于本题n达到了1e5,所以将这些数之间的差值全部求出来显然是不可行的,这里用的是二分答案。先通过二分,假设枚举出的答案为mid,即,这些数字差值绝对值的中位数为mid。然后我们在通过二分查找,对每一个数字,查找它后面的所有满足与它的差值小于等于mid的数的个数,即查找所有差值小于等于mid的对数。因为中位数所在的编号很容易求得,为 (n*(n-1)/2+1)/2(因为总共有n*(n-1)个差值,题目说了∣Xi - Xj∣ (1 ≤ i  j  N) )。然后将得到的差值小于等于mid 的对数与mid 的坐标相比较,从而判断该答案的对错。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int M =1e5+5;
typedef long long ll;
int n;
ll arr[M],res; bool juge(ll x){
ll sum=0;
for(int i=1;i<=n;i++)
sum+=lower_bound(arr+i,arr+1+n,arr[i]+x+1)-(arr+i)-1; //这是用于查找小于等于arr[i]+x的数的个数,即与arr[i]绝对值之差小于等于x的数的对数
return sum>=res; //如果大于等于理论值
} int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)
scanf("%lld",&arr[i]);
sort(arr+1,arr+n+1);
res=(n*(n-1)/2+1)/2; //小于等于差值中位数的对数
ll l=0,r=arr[n]-arr[1]; //差值最大为arr[n]-arr[1]
while(l<r){
ll mid=(l+r)>>1;
if(juge(mid))r=mid;
else l=mid+1;
}
printf("%lld\n",l);
}
return 0;
}

 

2018-09-20

POJ 3579 Median 【二分答案】的更多相关文章

  1. POJ 3579 Median 二分加判断

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12453   Accepted: 4357 Descripti ...

  2. POJ 3579 Median (二分)

                                                                                                         ...

  3. poj 3579 Median 二分套二分 或 二分加尺取

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5118   Accepted: 1641 Descriptio ...

  4. POJ 3579 Median(二分答案+Two pointers)

    [题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...

  5. POJ 3104 Drying(二分答案)

    题目链接:http://poj.org/problem?id=3104                                                                  ...

  6. POJ 3122 Pie 二分答案

    题意:给你n个派,每个派都是高为一的圆柱体,把它等分成f份,每份的最大体积是多少. 思路: 明显的二分答案题-- 注意π的取值- 3.14159265359 这样才能AC,,, //By Sirius ...

  7. POJ 3579 Median(二分答案)

    Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11599 Accepted: 4112 Description G ...

  8. poj 3579 Median (二分搜索之查找第k大的值)

    Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...

  9. POJ 3579 median 二分搜索,中位数 难度:3

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3866   Accepted: 1130 Descriptio ...

随机推荐

  1. InstallUtil操作WindowsService

    要安装windows service 首先要找到 InstallUtil.exe,InstallUtil.exe位置在 C:\Windows\Microsoft.NET\Framework\v4.0. ...

  2. maven install 报错 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    1.控制台打印信息 [INFO] Scanning for projects... [INFO] [INFO] ---------------------< org.cqupt.mauger:R ...

  3. django----Form详细信息

    Form类: 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; Django内置字段 Field required=True, 是否允许为 ...

  4. cf869C组合计数问题

    如果在两个区域里连点,两个区域内选的点数一定要相等 即a中选出i个点,必须与b中选出i个点相连 连接种类数为  然后我们再来看,如果ab中有两点相连,其中一点再与c相连会出事吗? 很显然不会对答案产生 ...

  5. bzoj 3529

    非常好的一道莫比乌斯反演题,对提升自己的能力有很大帮助. 首先我们分析一下题意:题意让我们求,其中 那么我们首先对后面的式子进行一下变形,变形过程详见https://blog.csdn.net/lle ...

  6. Android播放功能的实现

    Android播放语言功能的实现 需要用到的类文件TextToSpeech,此类可以实现播放语言的功能 支持播放的语言1.英语 2.法语 3.德语 4.意语 5.西班牙语 1.实例化此类,添加上下文对 ...

  7. 引用的作用&引用与指针的区别

    引入 C语言中函数有两种传参的方式: 传值和传址.以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参. 它的优点是避免了函数调用的一些副作用, 但 ...

  8. C# 读取sqlite文件

    class Program { static void Main(string[] args) { getsqliteData(); } public static void getsqliteDat ...

  9. IDEA拷贝操作

    另外一种添加方式

  10. 20165206 2017-2018-2 《Java程序设计》第6周学习总结

    20165206 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 String类:可以被直接使用,不可以有子类. String对象:可以使用String类声明 ...