原文链接http://www.cnblogs.com/zhouzhendong/p/8934377.html

题目传送门 - ARC080 E - Young Maids

题意

  给定一个长度为$n$的序列$p$,$p$为$1\cdots n$的一个排列。

  现在让你每次取出序列$p$的相邻两个,然后把他们按照原来的顺序放进序列$q$的最前面。注意每次这样的操作之后,$p$序列的剩余两半都会合并起来。

  不断进行上述操作,直到$p$为空。

  最小化序列$q$的字典序,并输出序列$q$。

  $n\leq 2\times 10^5$

题解

  这题就是随便贪心几下嘛。

  定义下标为奇数的项叫做奇项,下标为偶数的项叫做偶数项。

  我们考虑倒着还原原序列。

  这样可以便于我们取最小字典序。

  首先,考虑我们最后一次选择的项的下标在原序列中为$i,j$,那么在这之前,区间$[1,i),(i,j),(j,n]$不可能有相邻项。

  于是在最后一次操作之前,这三个区间之间不可能发生跨区间的操作,那么这三个区间的大小显然都是偶数。

  那么,我们考虑如何最小化开头两个数。

  显然,我们先在全局找一个值最小的奇项$i$,然后在$(i,n]$中找一个值最小的偶项$j$。

  然后成功把全局划分成$3$个区间。这个时候如果你去递归,说明你可能没睡好。

  我是测完样例才发现错了

  显然,虽然没有跨区间的操作,但是这些区间之间的操作是可以交替进行的。

  于是我们每次都要找最小的。然后每次都会继续划分子序列,这样会使候选序列中多出一些来。

  于是我们需要一个堆来维护最小值。

  至于求奇偶项的最小值,只需要在开始的时候写个线段树就可以了。

  然后我再一次的把$set$当堆用了。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int n,a[N],t[2][N<<2];
void update(int o,int rt,int L,int R,int pos){
if (a[pos]<a[t[o][rt]])
t[o][rt]=pos;
if (L==R)
return;
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
if (pos<=mid)
update(o,ls,L,mid,pos);
else
update(o,rs,mid+1,R,pos);
}
int query(int o,int rt,int L,int R,int xL,int xR){
if (L>xR||R<xL)
return 0;
if (xL<=L&&R<=xR)
return t[o][rt];
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
int Lans=query(o,ls,L,mid,xL,xR);
int Rans=query(o,rs,mid+1,R,xL,xR);
return a[Lans]<a[Rans]?Lans:Rans;
}
struct seg{
int L,R,v;
seg(){}
seg(int _L,int _R){
L=_L,R=_R,v=L>R?0:query(L&1,1,1,n,L,R);
}
friend bool operator < (seg A,seg B){
return a[A.v]<a[B.v];
}
};
int scnt=0;
set <seg> S;
int main(){
scanf("%d",&n);
a[0]=n+1;
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
update(i&1,1,1,n,i);
}
S.clear();
S.insert(seg(1,n));
for (int i=1;i<=n/2;i++){
seg now=*S.begin();
S.erase(S.begin());
int L=now.L,R=now.R;
int Lmid=now.v,Rmid=query((Lmid&1)^1,1,1,n,Lmid,R);
printf("%d %d ",a[Lmid],a[Rmid]);
S.insert(seg(L,Lmid-1));
S.insert(seg(Lmid+1,Rmid-1));
S.insert(seg(Rmid+1,R));
}
return 0;
}

  

AtCoder Regular Contest 080 (ARC080) E - Young Maids 线段树 堆的更多相关文章

  1. AtCoder Regular Contest 080 E - Young Maids

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_c 题目: E - Young Maids Time limit : 2sec / Memory li ...

  2. AtCoder Regular Contest 080 E:Young Maids

    题目传送门:https://arc080.contest.atcoder.jp/tasks/arc080_c 题目翻译 给你一个\(n\)的排列\(p\),一个空序列\(q\),你每次可以从\(p\) ...

  3. AtCoder Regular Contest 080 [CDEF]

    C - 4-adjacent Time limit : 2sec / Memory limit : 256MB Problem Statement We have a sequence of leng ...

  4. AtCoder Regular Contest 080

    手贱去开了abc,这么无聊.直接arc啊 C - 4-adjacent Time limit : 2sec / Memory limit : 256MB Score : 400 points Prob ...

  5. 【递归】【线段树】【堆】AtCoder Regular Contest 080 E - Young Maids

    给你一个1~n的排列p,n是偶数,每次从中任选一对相邻的数出来,插到排列q的开头,如此循环,问你所能得到的字典序最小的排列q. 我们先确定q开头的两个数q1,q2,q1一定是p的奇数位的最小的数,而q ...

  6. AtCoder Regular Contest 080 D - Grid Coloring

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_b 题目: D - Grid Coloring Time limit : 2sec / Memory ...

  7. AtCoder Regular Contest 080 C - 4-adjacent

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_a 题目: C - 4-adjacent Time limit : 2sec / Memory lim ...

  8. Atcoder arc080E Young Maids(线段树+优先队列)

    给出一个n排列,每次可以选择相邻的两个数字放在新的排列首部,问最后形成的新的排列字典序最小是? 考虑新排列的第一个数字,则应是下标为奇数的最小数,下标不妨设为i.第二个数字应该下标大于i且为偶数的最小 ...

  9. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

随机推荐

  1. 百度echarts插件x轴坐标显示不全决解方法

    X轴显示不全: xAxis.axisLabel.interval number, Function [ default: 'auto' ] 坐标轴刻度标签的显示间隔,在类目轴中有效. 默认会采用标签不 ...

  2. Laravel-Excel 导入 Excel 文件----为什么只获取到最后一行数据?

    ### 今天使用了Laravel-Excel 到类文件,想做一个excel  文件到导入和导出,但是看了 官方到文档示例,自己做了一下,发现 只取到到最后一行到数据, 有点摸不着头脑! 网上找了一下, ...

  3. ActiveMQ在Windows下的安装与启动(懒人专属)

    其实这些ActiveMQ官网都有,但是如果你懒得看官网,那就直接看这吧! 1. 官网下载最新的ActiveMQ安装包 apache-activemq-x.x.x-bin.zip并解压   2.进入安装 ...

  4. 基于官方mysql镜像构建自己的mysql镜像

    参考文章:https://www.jb51.net/article/115422.htm搭建步骤 1.首先创建Dckerfile: 1 2 3 4 5 6 7 8 9 10 11 12 FROM my ...

  5. log4net使用的两种方式

    1.首先添加log4net.dll引用(可以使用  管理NuGet程序包添加引用,也可以下载下来手动去添加引用) 2.在app.config文件中配置 3.log4net使用的2终方式 log4net ...

  6. Confluence 6 MySQL 数据库设置准备

    请查看 Supported Platforms 页面来获得 Confluence 系统支持的 MySQL 数据库版本.你需要在安装 Confluence 之前升级你的 MySQL 数据库. 如果你从其 ...

  7. MySQL、MongoDB、Redis 数据库之间的区别

    NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...

  8. SpringBoot多环境区分

    1.修改application.yml配置文件 spring: profiles: active: cppdy datasource: driver-class-name: com.mysql.jdb ...

  9. Python基础之re模块(正则表达式)

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中, 并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的 ...

  10. Python基础之初识类和对象

    我们在前面学习了解了面向过程编程,接下来我们一起来学习一下面向对象编程.其实不管是面向过程,还是面向对 象,说白了就是一种编程方式而已.既然是面向对象编程,顾名思义,此编程方式的落地需要使用 “类” ...