HDU 5338 ZZX AND PERMUTATIONS 线段树
多校题解
胡搞。。
。
题意太难懂了。
。
ZZX and Permutations
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 310 Accepted Submission(s): 83
ZZX knows that a permutation can be decomposed into disjoint cycles(see https://en.wikipedia.org/wiki/Permutation#Cycle_notation). For example:
145632=(1)(35)(462)=(462)(1)(35)=(35)(1)(462)=(246)(1)(53)=(624)(1)(53)……
Note that there are many ways to rewrite it, but they are all equivalent.
A cycle with only one element is also written in the decomposition, like (1) in the example above.
Now, we remove all the parentheses in the decomposition. So the decomposition of 145632 can be 135462,462135,351462,246153,624153……
Now you are given the decomposition of a permutation after removing all the parentheses (itself is also a permutation). You should recover the original permutation. There are many ways to recover, so you should find the one with largest lexicographic order.
the number of test cases.
Then t testcases
follow. In each testcase:
First line contains an integer n,
the size of the permutation.
Second line contains n space-separated
integers, the decomposition after removing parentheses.
n≤105.
There are 10 testcases satisfying n≤105,
200 testcases satisfying n≤1000.
numbers in a line for each testcase.
Don't output space after the last number of a line.
2
6
1 4 5 6 3 2
2
1 2
4 6 2 5 1 3
2 1
#include <iostream>
#include <fstream>
#include <string.h>
#include <string>
#include <time.h>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
using namespace std;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) pt(x / 10);
putchar(x % 10 + '0');
}
typedef long long ll;
typedef pair<int, ll> pii;
const double eps = 1e-9;
const int N = 200000 + 10;
#define L(x) tree[x].l
#define R(x) tree[x].r
#define M(x) tree[x].ma
#define ls (id<<1)
#define rs (id<<1|1)
struct node {
int l, r;
int ma;
}tree[N << 2];
int a[N], p[N];
void Up(int id) {
M(id) = max(M(ls), M(rs));
}
void build(int l, int r, int id) {
L(id) = l; R(id) = r;
if (l == r) { M(id) = a[l];return; }
int mid = (l + r) >> 1;
build(l, mid, ls); build(mid + 1, r, rs);
Up(id);
}
void update(int pos, int id) {
if (L(id) == R(id))
{
M(id) = -1;return;
}
int mid = (L(id) + R(id)) >> 1;
if (pos <= mid)update(pos, ls);
else update(pos, rs);
Up(id);
}
int query(int l, int r, int id) {
if (l == L(id) && R(id) == r)return M(id);
int mid = (L(id) + R(id)) >> 1;
if (r <= mid)return query(l, r, ls);
else if (mid < l)return query(l, r, rs);
else return max(query(l, mid, ls), query(mid + 1, r, rs));
}
int n;
int use[N], num[N];
pii b[N];
int ans[N];
void getcir(int l, int r) {
if (l > r)return;
for (int i = l; i <= r; i++) {
if (use[a[i]])continue;
int to = i + 1;
if (to > r) to = l;
ans[a[i]] = a[to];
use[a[i]] = 1;
num[a[to]] = 1;
update(i, 1);
}
}
int getmax(int l, int r) {
if (l > r)return -1;
return query(l, r, 1);
}
int hehe[N];
set<int>s;
int main() {
int T;rd(T);
while (T--) {
s.clear();
s.insert(0);
rd(n);
for (int i = 1; i <= n; i++) {
rd(a[i]);
p[a[i]] = i;
use[i] = num[i] = false;
b[i] = { a[i], i };
ans[i] = 0;
}
build(1, n, 1);
sort(b + 1, b + 1 + n);
int top = 0;
for (int i = 1; i <= n; i++) {
if (use[i])continue;
int idx = b[i].second;
int t[3] = { -1, -1, -1 };
if (idx < n && !num[a[idx+1]])t[0] = a[idx + 1];
top = -(*s.upper_bound(-idx));
t[1] = getmax(top + 1, idx - 1);
if (num[i]==false)t[2] = i;
if (t[0] > max(t[1], t[2]))
{
ans[i] = t[0]; use[i] = 1;
num[t[0]] = 1;
update(idx + 1, 1);
}
else if (t[1] > max(t[0], t[2]))
{
getcir(p[t[1]], idx);
s.insert(-idx);
}
else {
getcir(idx, idx);
s.insert(-idx);
}
}
for (int i = 1; i <= n; i++)
{
pt(ans[i]);i == n ? putchar('\n') : putchar(' ');
}
}
return 0;
}
/*
99
3
1 3 2
ans: 3 2 1
5
1 5 2 3 4
ans: 5 3 4 2 1 5
5 2 3 4 1
ans : 5 3 4 1 2 7
6 7 1 3 2 5 4
ans:7 5 3 4 2 6 1 1
8
1 3 6 4 8 7 2 5 1
5
3 2 4 5 1 */
HDU 5338 ZZX AND PERMUTATIONS 线段树的更多相关文章
- HDU 5338(ZZX and Permutations-用线段树贪心)
ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- hdu 5338 ZZX and Permutations (贪心+线段树+二分)
ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- 2015 Multi-University Training Contest 4 hdu 5338 ZZX and Permutations
ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
随机推荐
- 2-2 第二天 利用 QQ 浏览器代理调试端口
在没有域名服务器的情况下微信代理的方案 echo "api_key: N3DYn5356kYDvcd67fRxoecKxQV7fTE0" > ~/.ultrahook gem ...
- javascript必须知道的知识要点(二)
该文章不详细叙述各知识要点的具体内容,仅把要点列出来,供大家学习的时候参照,或者检测自己是否熟练掌握了javascript,清楚各个部分的内容. 内建对象可划分为数据封装类对象.工具类对象.错误类对象 ...
- 联想Thinkpad L460安装Win7 64位
单位发了L460,自带的系统为win10,但是涉及到很多工作以及客户都是在win7环境下,所以必须安装win7的系统,经过一番折腾,终于装好了. 主要顺序如下: 1,制作WINPE启动盘,如大白菜,老 ...
- System.Net.Mail 详细讲解
http://blog.csdn.net/liyanwwww/article/details/5507498
- JavaScript 元素的插入顺序以及动态加载js
*****************记录下今天的心得***************** 1.元素的插入顺序 需求:异步从后台读取两个数据a和b,并动态加载到父容器x中,要求a必须在b的左边 实际情况:一 ...
- 安卓通过UDP协议传输数据,中文乱码的问题
公司最近需要往智能家居方面发展,需要用到UDP协议传输数据,在网上找到了一些资料,但是发现传输中文的时候有乱码的现象,经过我多番捣鼓,终于解决了这个问题,下面贴上关键代码 客户端: public cl ...
- Excel常用的小技巧
1.Excel如何实现单元格内轻松换行:按住ALT+enter就可以了. 2.Excel固定表头:在“视图”>冻结窗口>冻结首行. 3.防止电脑突然断电,导致正在编辑的Excel数据丢失, ...
- 使用CImage类 显示图片
在不适用openCv的一种时候,使用CImage显示图片数据,并且直接嵌入DC框中. 使用CImage 在pic控件里显示图片 void CMyCalLawsDlg::MyShowImage( CIm ...
- mvc登录授权特性
public class CommonAuthorize : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContex ...
- (转)Openlayers 2.X加载高德地图
http://blog.csdn.net/gisshixisheng/article/details/44853881 概述: 前面的有篇文章介绍了Openlayers 2.X下加载天地图,本节介绍O ...