【算法】数学+堆

【题意】给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序。

【题解】

转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前序列的奇数位置,p2在当前序列的偶数位置且位于p1之后。满足条件的情况下每次找最小。

每次找到p1和p2都把序列划分为3部分,递归进行,初步想到使用归并。

进一步考虑性质,每对数字要出现必须它的上属序列的p1和p2必须出现,此外没有其他要求。

所以用优先队列维护每个序列,序列的优先级为p1,每次处理一个序列才能加入其三个子序列。

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=,inf=0x3f3f3f3f;
int a[maxn],n,logs[maxn],d[][maxn][],pos[maxn];
struct cyc{
int l,r,x;
bool operator <(const cyc &a)const
{return x>a.x;}
};
priority_queue<cyc>q; void RMQ_INIT(int k){
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)-<=n;i++)
d[k][i][j]=min(d[k][i][j-],d[k][i+(<<(j-))][j-]);
}
int rmq(int l,int r,int k){
int K=logs[r-l+];
return min(d[k][l][K],d[k][r-(<<K)+][K]);
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
d[i&][i][]=a[i];//1奇数
d[(i&)^][i][]=inf;//0偶数
pos[a[i]]=i;//因为是排列可以直接记位置,省去RMQ的位置记录。
}
logs[]=-;for(int i=;i<=n;i++)logs[i]=logs[i>>]+;
RMQ_INIT();RMQ_INIT();
q.push((cyc){,n,rmq(,n,)});
int L,R,p1,p2;
while(!q.empty()){
cyc x=q.top();q.pop();
L=x.l;R=x.r;p1=pos[x.x];
p2=pos[rmq(p1+,R,(p1&)^)];
printf("%d %d ",a[p1],a[p2]);
if(L<p1)q.push((cyc){L,p1-,rmq(L,p1-,(L&))});
if(p1<p2-)q.push((cyc){p1+,p2-,rmq(p1+,p2-,(p1+)&)});
if(p2<R)q.push((cyc){p2+,R,rmq(p2+,R,(p2+)&)});
}
return ;
}

【Atcoder】ARC 080 E - Young Maids的更多相关文章

  1. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  2. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  3. 【AtCoder】 ARC 097

    link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...

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

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

  5. 【AtCoder】 ARC 096

    link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...

  6. 【AtCoder】 ARC 098

    link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...

  7. 【AtCoder】 ARC 099

    link C-Minimization 枚举覆盖\(1\)的区间,两边的次数直接算 #include<bits/stdc++.h> #define ll long long #define ...

  8. 【AtCoder】 ARC 100

    link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把 ...

  9. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...

随机推荐

  1. win10 java环境变量配置

    首先,你应该已经安装了 Java 的 JDK 了(如果没有安装JDK,请跳转到此网址:http://www.oracle.com/technetwork/java/javase/downloads/i ...

  2. mysql8.0.14 安装

    1.下载 地址:https://dev.mysql.com/downloads/mysql/ 找到zip压缩文件. 2.配置环境变量 把解压后的路径配置到环境变量中 3.安装 在解压后的文件夹中新建m ...

  3. memcached的认识

    <?php /* memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH表,该表 ...

  4. 转---详细的Android开发环境搭建教程

    五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程 引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立A ...

  5. 【转】给大家分享一下目前mlc颗粒的内存卡资料

    以下信息是LZ从其它论坛上找到的TF卡也是有讲究的,一分价钱一分货 dboy99 楼主 骚(6) #1楼 2015-8-5 14:49引用Micro SD卡也叫TF卡,作为手机扩展存储空间的唯一方式用 ...

  6. Java 对象及其内存控制

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...

  7. jsp中的session和上下文

    Session的典型应用: 防止用户非法登录到某个页面. 网上商城的购物车 保存用户登录信息 注:多个请求要用的东西放在session中,多个会话之间要用的东西放在上下文中. 如何创建session? ...

  8. TCP/IP Note1

    TCP/IP(Transmission Control Protocol / Internet Protocol)是用于Internet的通信协议. 计算机通信协议:是指对那些计算机必须遵守以便彼此通 ...

  9. Codeforces Round #383 (Div. 1) C(二分图)

    一道很巧妙的二分图的题目 简单分析性质可知,一个合法序列一定是由12,21这样的子串构成的,所以相邻的每隔2个两两配对 然后BF和GF互相配对,思考一下,如果存在奇环,那么必定有一个BG有两个GF,或 ...

  10. hdu3068最长回文(Manacher算法)

    简单来说这是个很水的东西.有点dp的思想吧.推荐两个博客,很详细. http://blog.csdn.net/xingyeyongheng/article/details/9310555 http:/ ...