pid=5338" target="_blank" style="text-decoration:none; color:rgb(45,125,94); background-color:transparent">链接

多校题解

胡搞。。

题意太难懂了。

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

Problem Description
ZZX likes permutations.



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.
 
Input
First line contains an integer t,
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.
 
Output
Output n space-separated
numbers in a line for each testcase.

Don't output space after the last number of a line.
 
Sample Input
2
6
1 4 5 6 3 2
2
1 2
 
Sample Output
4 6 2 5 1 3
2 1
 
Author
XJZX
 
Source
#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 线段树的更多相关文章

  1. HDU 5338(ZZX and Permutations-用线段树贪心)

    ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  2. hdu 5338 ZZX and Permutations (贪心+线段树+二分)

    ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  3. 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 ...

  4. 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations

    题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...

  5. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  6. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  7. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  8. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  9. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

随机推荐

  1. Java数据库编程及Java XML解析技术

    1.JDBC概述 A.  什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口 ...

  2. nodejs安装express

    最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: 1 express -t ejs microblog 可是执行后 ...

  3. selenium3 + python - gird分布式(转载)

    本篇转自博客:上海-小T 转载链接:https://blog.csdn.net/real_tino/article/details/53467406 Selenium grid是用来分布式执行测试用例 ...

  4. Moco模拟服务器实现请求&响应 (一)

    接口测试Moco工具 1.使用Moco模拟,首先需要下载Moco 的jar 包,下载链接: http://central.maven.org/maven2/com/github/dreamhead/m ...

  5. 猜拳游戏项目(涉及知识点Scanner、Random、For、数组、Break、Continue等)

    package day03.d3.xunhuankongzhi; import java.util.Scanner; public class CaiQuan { public static void ...

  6. mac下配置nginx

    nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,下面我们来了解下nginx的用法. 安装nginx 使用brew安装nginx brew install ...

  7. 2.0 Linux系统的安装之Fedora安装单系统(2)

    2.0 Linux系统的安装之Fedora安装单系统(2) *Linux系统的安装之Fedora安装单系统 恐怕最好装的系统就是Linux系统了,或者与Windows并列.此篇教程为Fedora的单系 ...

  8. view在使用shape属性加圆角的同时,用代码修改其他background属性(例如颜色)不生效

    项目中一个TextView控件设置了shape属性,给其加了圆角,如下: houlder.mtxtGovernmentType.setBackgroundResource(R.drawable.tv_ ...

  9. python 上手

    1.安装模块 cmd---“pip install [模块名]” 2.爬虫常用模块 requests beautifulsoup4 3.检查已安装的模块 cmd ---"pip list&q ...

  10. SQL语言入门

    内容来源:唐成. PostgreSQL修炼之道[M]. 机械工业出版社, 2015. 此书购买链接:京东 亚马逊 SQL(Structured Query Language) 结构化查询语言 1. 语 ...