POJ-3579 Median---二分第k大(二分套二分)
题目链接:
https://cn.vjudge.net/problem/POJ-3579
题目大意:
求的是一列数所有相互之间差值的序列的最中间的值是多少。
解题思路:
可以用二分套二分的方法求解第m大,和POJ-3685类似,这里的模板也差不多
枚举第m大x,判断小于等于x的数目是不是大于m,如果大于m说明x >= 第m大,调整区间r = mid - 1
不然l = mid + 1
此处是大于m而不是小于m是因为一个数可能出现多次,那么小于等于中间的数目可能就比m大
在计算小于等于x的数目的时候,用upperlower函数求解即可
一开始TLE是因为左右区间没选好,应该选给定的数字中的最大值减最小值作为右区间
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const ll INF = 1e9 + ;
const int maxn = 1e6 + ;
ll a[maxn], n, m; ll ok(ll mid)
{
ll ans = ;
for(int i = ; i < n; i++)//此处不等于n是由于到了n没有比它更大的了,加上=也无妨
{
if(a[i] + mid >= a[n])//可以加速一点
{
ans += n - i;
continue;
}
int t = upper_bound(a + i, a + n + , a[i] + mid) - a;//这里用区间a+i而不是a+1可以加速求解
ans += t - - i;
}
return ans;
}
int main()
{
while(scanf("%lld", &n) != EOF)
{
for(int i = ; i <= n; i++)scanf("%lld", &a[i]);
sort(a + , a + n + );
m = n * (n - ) / ;
m = (m + ) / ;//求出第m个
ll l = , r = a[n] - a[], ans;
while(l <= r)
{
ll mid = (l + r) / ;
if(ok(mid) >= m)//小于等于mid的数字个数 >= m 说明mid>=最优解
{
ans = mid;
r = mid - ;
}
else l = mid + ;
}
printf("%lld\n", ans);
}
return ;
}
POJ-3579 Median---二分第k大(二分套二分)的更多相关文章
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- POJ 3579 Median 二分加判断
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12453 Accepted: 4357 Descripti ...
- poj 3579 Median 二分套二分 或 二分加尺取
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5118 Accepted: 1641 Descriptio ...
- 51 NOD 1685 第K大区间2 二分+BIT
题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 ...
- 51nod 第K大区间2(二分+树状数组)
题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...
- [51NOD1105]第k大的数(二分答案)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 先排序,二分上下界分别是最小的两个数和最大的两个数的乘积 ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- 1105 第K大的数(二分)
1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0 ...
- ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...
随机推荐
- storm(2)-机制
1.storm vs esper 2.storm vs spark streaming storm处理的是每次传入的一个事件:spark streaming 处理的是某个时间段窗口内的事件流. 因此 ...
- vue组件(持续更新)
1.vee-validate :vue的表单验证组件 网友博客介绍:https://www.cnblogs.com/xxwang/p/6104715.html
- Win32 进程间通信的分析与比较
1 进程与进程通信 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线 程是Windows操作系统的一个基本特征.M ...
- java多线程-Thread
大纲 sleep yield join setDaemon sleep: public static native void sleep(long millis) throws Interrupted ...
- C语言中的输入方式
在c语言中,有gets().scanf().getchar()等输入方式,但是不同的方式处理的方式不同. scanf()读取时遇见tab.space.enter时会结束读取,不会舍弃最后的回车符(即回 ...
- Lua初探
官方网站:http://www.lua.org/ 三方模块:https://luarocks.org/ 介绍安装luarocks语法注释标示符关键字全局变量数据类型变量赋值索引循环流程控制函数可变 ...
- zookeeper简单命令
bin/zkCli.sh -server ls / create /zk_test my_data get /zk_test set /zk_test admln delete /zk_test ad ...
- Maven工程红色感叹号,且工程无红叉错误
很可能是jar包不对,可以将maven库里的jar包删除,从 http://mvnrepository.com/ 根据jar包版本号下载到本地maven库,并在pom.xml里引入jar依赖 这次ja ...
- UML建模—EA创建Use Case(用例图)
用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 1.新建用例图 2.用例图工具: 3.一个简单用例: 用例图所包含的元素如下: 1. Act ...
- 解决iframe IE8透明不兼容
要使 ie8 的 iframe 的透明,需要设置两点: 设置 iframe 的 allowTransparency 属性值为 true: <iframe allowtransparency=&q ...