POJ-3579 Median
Median#
给n组数,将其两两之差列为新的数列,求这个数列的中位数
二分套二分
很容易想到是二分答案,查看有多少个数小于等于这个答案
抽象的地方在于查询有多少个差小于等于当前的差,通过二分在原数组的位置来判断,有多少个数 ,从而判断以的差小于当前的差,然后跑下来就行
时间复杂度是
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
ll num[maxn], n;
ll query(ll val)
{
ll ans = 0;
for(int i=0; i<n; i++)
{
ll way = upper_bound(num, num + n, num[i] + val) - num;
ans += way - i - 1;
}
return ans;
}
int main()
{
while(scanf("%lld", &n) != EOF)
{
for(int i=0; i<n; i++)
scanf("%d", &num[i]);
sort(num, num + n);
ll l = 0, r = num[n-1];
ll sum = (n * (n - 1) / 2 + 1) / 2;
while(l < r)
{
ll mid = l + r >> 1;
if(query(mid) >= sum)
r = mid;
else
l = mid + 1;
}
printf("%lld\n", l);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!