uoj#280. 【UTR #2】题目难度提升(构造)
咱先膜一下\(GXZ\)再说
我们先把序列从小到大排序,然后分情况讨论
无解是不存在的,从小到大输出所有数肯定可行
情况一,如果\(a[mid]=a[mid+1]\),因为最终的中位数也是它们,那么我们可以让中位数一直等于\(a[mid]\),找到最大的\(k\)满足\(a[k]=a[mid]\),那么就先删\(k\),然后再删\(k-1,n,k-2,n-1,...\)那么显然这个过程中中位数始终为\(a[mid]\),且满足字典序最大
情况二,如果\(a[mid]\neq a[mid+1]\)且存在\(k<\lceil\frac n2\rceil,a_k=a_{k+1}\),那么我们可以从\(k\)开始取,然后按\(k-1,n,k-2,n-1,...\)的顺序取,最后前面的数一定会被取完,而且这个过程中中位数不变
情况三,第一个数只能取\(a[1]\),因为很明显删数的过程中要始终满足删的数不能小于已删的数的中位数否则\(GG\)
于是维护一个叫做对顶堆的东西,简单来说就是把小的数放一个大根堆里,大的数放一个小根堆里,并保证两堆的元素个数之差不超过\(1\),那么中位数只要从两个堆顶取就行了
对于剩下的所有未删除的数,因为按照我们上面的做法,情况一是已经做完了,情况二和情况三都会删到只剩一个连续的区间,且这个区间的中位数大于等于已经删的数的中位数,于是每一次加入能使中位数大于等于剩下的最小的数的就行了
//minamoto
#include<bits/stdc++.h>
#define R register
#define IT set<int>::iterator
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]=' ';
}
const int N=1e5+5;
multiset<int>s;priority_queue<int>A,B;
int a[N],vis[N],n;
void push(int x){
if(A.empty()||x<=A.top())A.push(x);
else B.push(-x);
if(A.size()<B.size())A.push(-B.top()),B.pop();
if(A.size()-B.size()>1)B.push(-A.top()),A.pop();
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)a[i]=read();
sort(a+1,a+1+n);
int mid=(n+1)>>1;
if(a[mid]==a[mid+1]){
while(mid<n&&a[mid]==a[mid+1])++mid;
print(a[mid]);
int p=mid-1,q=n;
while(p||q>mid){
// printf("%d %d\n",p,q);
if(p)print(a[p--]);
if(q>mid)print(a[q--]);
}return Ot(),0;
}
while(mid>1&&a[mid]!=a[mid-1])--mid;
print(a[mid]),vis[mid]=1;
int p=mid-1,q=n;IT it;
while(p&&q>mid)print(a[p]),print(a[q]),vis[p--]=vis[q--]=1;
fp(i,1,n)if(vis[i])push(a[i]);else s.insert(a[i]);
while(!s.empty()){
p=*s.begin();
if(A.size()==B.size())it=(p>=-B.top())?--s.end():s.begin();
else{
if(!B.empty()&&p*2>=A.top()-B.top())it=--s.end();
else it=--s.upper_bound(p*2-A.top());
}
print(*it),push(*it),s.erase(it);
}
return Ot(),0;
}
uoj#280. 【UTR #2】题目难度提升(构造)的更多相关文章
- 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set
题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...
- 【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升
[UOJ#278][UTR #2]题目排列顺序 试题描述 “又要出题了.” 宇宙出题中心主任 —— 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这 ...
- 【UOJ #280】【UTR #2】题目难度提升
http://uoj.ac/problem/280 非常难想的贪心,用set\(O(nlogn)\). 调了一天qwq. 题解 #include<set> #include<cstd ...
- uoj280 【UTR #2】题目难度提升 堆维护中位数+set
题目传送门 http://uoj.ac/problem/280 题解 这道题很妙啊. 这种题目如果给予选手足够的时间,每一个选手应该都能做出来. 大概就是核心思路看上去很简单,但是想要推出来并不简单. ...
- 【uoj#225】[UR #15]奥林匹克五子棋 构造
题目描述 两个人在 $n\times m$ 的棋盘上下 $k$ 子棋,问:是否存在一种平局的情况?如果存在则输出一种可能的最终情况. 输入 第一行三个正整数 $n,m,k$ ,意义如前所述. 输出 如 ...
- HDU 3076 ssworld VS DDD 概率dp,无穷级数,oj错误题目 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=3076 不可思议的题目,总之血量越少胜率越高,所以读取时把两人的血量交换一下 明显每一轮的胜率和负率都是固定的,所 ...
- UVa 11627 - Slalom 二分. oj错误题目 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UOJ Test Round #2
昨天晚上打的这个比赛,简直一颗赛艇啊-- 感觉发挥的并不好.比赛的时候比较紧张,最后一题还脑残写了个离散化结果爆零了,哎我怎么这么逗逼-- 讲讲比赛经过吧. 比赛之前逗逼地以为是8:00开始,然后淡定 ...
- Noip模拟62 2021.9.26
T1 Set 真就随机化拿了$90$?? 不过还是有依据的,毕竟这道题出解的几率很大,随出答案的概率也极大 所以不妨打一个随机化 1 #include<bits/stdc++.h> 2 # ...
随机推荐
- 使用viewholder优化listview,减少findViewById的次数
- jQuery 的文档操作
在 js 中也有DOM操作,也可以进行 增删改查 ,但是通过 js 的DOM操作会发现,我的天哪,代码好多.但是 jQuery的文档操作就少了很多. js 中 DOM 的示例 : var box = ...
- github 博客模板
http://www.jianshu.com/p/d658ba3b4351 http://jekyllthemes.org/
- __builtin_constant_p(x) (转帖
本文转载自:http://blog.chinaunix.net/uid-29254195-id-3977753.html gcc的内建函数,当x为常数时返回1, x为变量时返回0. 不过这并不完全准确 ...
- Spring Boot2.0之全局捕获异常
全局捕获异常,很明显的错误404返回给客户,很不好呀.整个web请求项目全局捕获异常,比如空指针直接返回给客户啊,那多操蛋呀~ 看这几个常用的注解: @ExceptionHandler 表示拦截异常 ...
- linux应用之Lamp(apache+mysql+php)的源码安装(centos)
Linux+Apache+Mysql+Php源码安装 一.安装环境: 系统:Centos6.5x64 Apache: httpd-2.4.10.tar.gz Mysql: mysql-5.6.20-l ...
- ES禁用_source不会影响聚合
From Elasticsearch's website: The _source field contains the original JSON document body that was pa ...
- SpringBoot_00_资源汇总贴
一.精选 1.Spring Boot文档 二.参考资料 1.springboot-learning-example 2.Spring boot 那些事 3.Spring Boot干货系列 4.Spri ...
- hdu 6109 数据分割
/** * 题目描述有点坑,勉强能读懂,大致意思,有多组约束条件.原本每组数据之间是有分界符号的 * 现在分界符号没了,让你找出原来每组数据多少个条件,并且告诉,每组的最后一个条件会使得与前面的 * ...
- Spring笔记03(Spring创建对象的三种方式)
1.创建对象的三种方式和bean的生命周期的验证: Animal接口代码: package cn.pb.dao; /** * 动物接口 */ public interface Animal { //吃 ...