luogu P1168 中位数 |树状数组+二分
2024-09-01 20:01:52
题目描述
给出一个长度为NN的非负整数序列A_i,对于所有1 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A_1, A_3, …, A_2k - 1的中位数。即前1,3,5,…个数的中位数。
输入格式
第1行为一个正整数N,表示了序列长度。
第2行包含N个非负整数A_i (A_i ≤ 10^9)
输出格式
共(N + 1) / 2(N+1)/2行,第ii行为A_1, A_3, …, A_2k - 1 的中位数。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N], n;
bool vis[N];
inline void add(int x,int y){
for(;x<N;x+=x&(-x))c[x]+=y;
}
inline int sum(int x){
int ans=0;
for(;x;x-=x&(-x))ans+=c[x];
return ans;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
for(int i=1;i<=n;i++){
int op=lower_bound(b+1,b+1+n,a[i])-b;
while(vis[op])op++;
vis[op]=1;
a[i]=op;
}
for(int i=1;i<=n;i++){
add(a[i],1);
if(!(i&1))continue;
int l=0,r=n,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(sum(mid-1)<=sum(n+1)-sum(mid)){
l=mid+1;
ans=mid;
}else r=mid-1;
}
cout<<b[ans]<<endl;
}
}
最新文章
- ldap部署相关,ldap双机\LAM配置管理\ldap备份还原
- Git 修改源地址
- js获取上传文件个数 以及名称
- 从零开始系列--R语言基础学习笔记之一 环境搭建
- [Java] 两种发起POST请求方法,并接收返回的响应内容的处理方式
- [转] Web前端优化之 内容篇
- [置顶] JAVA概述(6)常量,关键字,进制转换
- 作为.net程序员学jsp,伤不起
- Bash : test 命令
- CS Round#49 C Max Substring
- C# Split 字符文本中的字符太多
- [LeetCode] Keyboard Row 键盘行
- php 多维数组 array sort 排序 :array_multisort
- asp.net mvc Areas 母版页动态获取数据进行渲染
- linux文件属性的10个字符各代表什么意思
- SQL中not in 和not exists
- 【题解】Luogu P3203 [HNOI2010]弹飞绵羊
- Hive QL的操作
- HDU1370(中国剩余定理)
- JVM总结(一):概述--JVM运行时数据区