传送门

咱先膜一下\(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】题目难度提升(构造)的更多相关文章

  1. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  2. 【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升

    [UOJ#278][UTR #2]题目排列顺序 试题描述 “又要出题了.” 宇宙出题中心主任 —— 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这 ...

  3. 【UOJ #280】【UTR #2】题目难度提升

    http://uoj.ac/problem/280 非常难想的贪心,用set\(O(nlogn)\). 调了一天qwq. 题解 #include<set> #include<cstd ...

  4. uoj280 【UTR #2】题目难度提升 堆维护中位数+set

    题目传送门 http://uoj.ac/problem/280 题解 这道题很妙啊. 这种题目如果给予选手足够的时间,每一个选手应该都能做出来. 大概就是核心思路看上去很简单,但是想要推出来并不简单. ...

  5. 【uoj#225】[UR #15]奥林匹克五子棋 构造

    题目描述 两个人在 $n\times m$ 的棋盘上下 $k$ 子棋,问:是否存在一种平局的情况?如果存在则输出一种可能的最终情况. 输入 第一行三个正整数 $n,m,k$ ,意义如前所述. 输出 如 ...

  6. HDU 3076 ssworld VS DDD 概率dp,无穷级数,oj错误题目 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=3076 不可思议的题目,总之血量越少胜率越高,所以读取时把两人的血量交换一下 明显每一轮的胜率和负率都是固定的,所 ...

  7. UVa 11627 - Slalom 二分. oj错误题目 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  8. UOJ Test Round #2

    昨天晚上打的这个比赛,简直一颗赛艇啊-- 感觉发挥的并不好.比赛的时候比较紧张,最后一题还脑残写了个离散化结果爆零了,哎我怎么这么逗逼-- 讲讲比赛经过吧. 比赛之前逗逼地以为是8:00开始,然后淡定 ...

  9. Noip模拟62 2021.9.26

    T1 Set 真就随机化拿了$90$?? 不过还是有依据的,毕竟这道题出解的几率很大,随出答案的概率也极大 所以不妨打一个随机化 1 #include<bits/stdc++.h> 2 # ...

随机推荐

  1. java和js互调 webview

    public class JavaAndJSActivity extends Activity implements View.OnClickListener { private EditText e ...

  2. 认识与入门 Markdown

    Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...

  3. property 中的strong 与weak

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *string1; @property ...

  4. Swift 烧脑体操(一) - Optional 的嵌套

    前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...

  5. absolute布局的替代实现

    京东商城首页标价定位 小横条首页导航的下拉 1.京东商城首页标价定位 .p-img{ height: 130px;} .p-price{ margin:-28px 0 0 74px;} .price{ ...

  6. 在ubuntu怎样修改默认的编码格式

    ubuntu修改系统默认编码的方法是: 1. 参考 /usr/share/i18n/SUPPORTED 编辑/var/lib/locales/supported.d/* gedit /var/lib/ ...

  7. 6410开发板sd卡启动时烧写u-boot.bin以及u-boot-spl-16k.bin步骤

    参考文档:<SMDK6410_IROM_APPLICATION NOTE_REV 1.00>(可以从这里下载到> 参考博客:Tekkaman的博文<u-boot-2010.09 ...

  8. Android字符设备驱动开发基于高通msm8916【原创 】

    本人才疏浅学,写一篇文档总结自己在msm8916平台上移植自己编写的简单的字符设备驱动开发的整个流程.这个小项目的主要功能是开发一个简单的APP,APP通过JNI去调用位于kernel的字符设备驱动. ...

  9. Kafka0.7运行时报错 kafka/javaapi/consumer/ConsumerConnector : Unsupported major.minor version 51.0 解决

    目前中央库中 org.apache.kafka 是用jdk1.7编译的, 故跑在1.6的jvm中会报错 解决方案: 1. 下载kafka源码, 本地sbt进行install, 编译前 java -ve ...

  10. 利用ThinkPHP做项目步骤

    ThinkPHP使用规则:约定大于配置 创建入口文件: 1.在ThinkPHP目录下创建一个入口文件index.php 2.访问入口文件的同时系统会自动把对应的应用目录文件Test创建出来 3.打开H ...