AtCoder Regular Contest 080 E - Young Maids
地址:http://arc080.contest.atcoder.jp/tasks/arc080_c
题目:
E - Young Maids
Time limit : 2sec / Memory limit : 256MB
Score : 800 points
Problem Statement
Let N be a positive even number.
We have a permutation of (1,2,…,N), p=(p1,p2,…,pN). Snuke is constructing another permutation of (1,2,…,N), q, following the procedure below.
First, let q be an empty sequence. Then, perform the following operation until p becomes empty:
- Select two adjacent elements in p, and call them x and y in order. Remove x and y from p (reducing the length of p by 2), and insert x and y, preserving the original order, at the beginning of q.
When p becomes empty, q will be a permutation of (1,2,…,N).
Find the lexicographically smallest permutation that can be obtained as q.
Constraints
- N is an even number.
- 2≤N≤2×105
- p is a permutation of (1,2,…,N).
Input
Input is given from Standard Input in the following format:
N
p1 p2 … pN
Output
Print the lexicographically smallest permutation, with spaces in between.
思路:
不想自己写了,结合我代码看官方题解吧。

#include <bits/stdc++.h> using namespace std; #define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> PII;
const double eps=1e-;
const double pi=acos(-1.0);
const int K=3e5+;
const int mod=1e9+; int n,vb[*K],vc[*K],ff[*K],hs[K],a[K];
//vb奇数,vc偶数
void push_down(int o)
{
if(ff[o])
{
swap(vb[o<<],vc[o<<]);
swap(vb[o<<|],vc[o<<|]);
ff[o<<]^=ff[o],ff[o<<|]^=ff[o];
ff[o]=;
}
}
void update(int o,int l,int r,int pos,int x)
{
if(l==r)
{
if(pos&) vb[o]=x,vc[o]=K;
else vb[o]=K,vc[o]=x;
return ;
}
int mid=l+r>>;
push_down(o);
if(pos<=mid) update(o<<,l,mid,pos,x);
else update(o<<|,mid+,r,pos,x);
vb[o]=min(vb[o<<],vb[o<<|]);
vc[o]=min(vc[o<<],vc[o<<|]);
}
void update2(int o,int l,int r,int nl,int nr)
{
if(l==nl&&r==nr)
{
ff[o]^=;swap(vb[o],vc[o]);
return ;
}
int mid=l+r>>;
push_down(o);
if(nr<=mid) update2(o<<,l,mid,nl,nr);
else if(nl>mid) update2(o<<|,mid+,r,nl,nr);
else update2(o<<,l,mid,nl,mid),update2(o<<|,mid+,r,mid+,nr);
vb[o]=min(vb[o<<],vb[o<<|]);
vc[o]=min(vc[o<<],vc[o<<|]);
}
int query(int o,int l,int r,int nl,int nr)
{
if(l==nl&&r==nr)return vb[o];
int mid=l+r>>;
push_down(o);
if(nr<=mid) return query(o<<,l,mid,nl,nr);
else if(nl>mid) return query(o<<|,mid+,r,nl,nr);
else return min(query(o<<,l,mid,nl,mid),query(o<<|,mid+,r,mid+,nr));
}
struct node
{
int l,r,pl,pr;
node(){}
node(int i,int j,int p,int q){l=i,r=j,pl=p,pr=q;}
bool operator<(const node &ta)const
{
if(a[pl]==a[ta.pl]) return a[pr]>a[ta.pr];
return a[pl]>a[ta.pl];
}
};
node sc(int l,int r)
{
int x=query(,,n,l,r);
update(,,n,hs[x],K);
if(hs[x]+<=r)
update2(,,n,hs[x]+,r);
int y=query(,,n,hs[x]+,r);
update(,,n,hs[y],K);
if(hs[y]+<=r)
update2(,,n,hs[y]+,r);
return node(l,r,hs[x],hs[y]);
}
priority_queue<node>q;
int main(void)
{
scanf("%d",&n);
for(int i=,mx=n*;i<=mx;i++) vb[i]=vc[i]=K;
for(int i=;i<=n;i++)
{
scanf("%d",a+i);
update(,,n,i,a[i]);
hs[a[i]]=i;
}
q.push(sc(,n));
while(q.size())
{
node tmp=q.top();
q.pop();
printf("%d %d ",a[tmp.pl],a[tmp.pr]);
if(tmp.pl->tmp.l) q.push(sc(tmp.l,tmp.pl-));
if(tmp.pl+<tmp.pr-) q.push(sc(tmp.pl+,tmp.pr-));
if(tmp.pr+<tmp.r) q.push(sc(tmp.pr+,tmp.r));
}
return ;
}
AtCoder Regular Contest 080 E - Young Maids的更多相关文章
- AtCoder Regular Contest 080 (ARC080) E - Young Maids 线段树 堆
原文链接http://www.cnblogs.com/zhouzhendong/p/8934377.html 题目传送门 - ARC080 E - Young Maids 题意 给定一个长度为$n$的 ...
- AtCoder Regular Contest 080 E:Young Maids
题目传送门:https://arc080.contest.atcoder.jp/tasks/arc080_c 题目翻译 给你一个\(n\)的排列\(p\),一个空序列\(q\),你每次可以从\(p\) ...
- AtCoder Regular Contest 080 [CDEF]
C - 4-adjacent Time limit : 2sec / Memory limit : 256MB Problem Statement We have a sequence of leng ...
- AtCoder Regular Contest 080
手贱去开了abc,这么无聊.直接arc啊 C - 4-adjacent Time limit : 2sec / Memory limit : 256MB Score : 400 points Prob ...
- 【递归】【线段树】【堆】AtCoder Regular Contest 080 E - Young Maids
给你一个1~n的排列p,n是偶数,每次从中任选一对相邻的数出来,插到排列q的开头,如此循环,问你所能得到的字典序最小的排列q. 我们先确定q开头的两个数q1,q2,q1一定是p的奇数位的最小的数,而q ...
- AtCoder Regular Contest 080 D - Grid Coloring
地址:http://arc080.contest.atcoder.jp/tasks/arc080_b 题目: D - Grid Coloring Time limit : 2sec / Memory ...
- AtCoder Regular Contest 080 C - 4-adjacent
地址:http://arc080.contest.atcoder.jp/tasks/arc080_a 题目: C - 4-adjacent Time limit : 2sec / Memory lim ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 098
AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定 ...
随机推荐
- 在化学教学中怎么用ChemOffice
在21世纪新课程化学教学中,有很多地方要求化学教师使用计算机和应用程序处理各类化学信息,比如课堂教学.撰写教学论文.制作多媒体课件等,这样可以有效增强教学效果.作为化学教师,在新课程的化学教学中掌握一 ...
- C语言程序真正的启动函数
为什么要用”真正”这个词?因为我们从学C语言开始,都会先明白这个道理,即C语言有且仅有一个main函数,main函数是C语言的入口点和出口点!(可以参考>http://www.dotcpp.co ...
- 模拟http请求 带 chunked解析办法一
今天在干坏事抓取别人页面时候遇到一个问题,平时我们在post数据后,大不了要求提交cookie,但是今天这个测试了N遍不需要coookie都行的,但是抓取到的始终是乱码,怎么解析都不行.于是自己又把c ...
- python 绘制3D散点图
import scipy.io as sio from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt a = [ ...
- IIS中,当文件夹被删除时,防止应用程序重启的解决办法
如果你曾经修改了ASP.NET应用程序(dll文件),与修改了bin文件夹或Web.config文件(添加/删除/重命名的文件等),而该网 站在运行,你可能已经注意到,这将导致在AppDomain的重 ...
- 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度
[BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可 ...
- Microsoft License Keys – Volume
VLK Product Group Product KeyOffice XP Applications P3HBK-F86Y2-374PQ-KW92R-B36VTOffice 2003 Suites ...
- 使用Git分支开发新特性或修复Bug与使用Git分支开发新特性或修复Bug
使用Git分支开发新特性或修复Bug 通过分支,可以在不影响原有代码的前提下改变代码,主要用于开发新功能新特性.下 一代产品 为已经发布的正式版修复bug 团队开发时为每个人建立一个分支,从而避免相互 ...
- CentOS下调整home和根分区大小的方法
解决外挂硬盘的问题. 目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root 1.首先查看磁盘使用情况[root@jb51.net~]# df -h ...
- 剪花布条---hdu2087(kmp模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...