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],求环序列中逆序对 ...
随机推荐
- succ
- Java项目打包发布
Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...
- java Collection接口
Collection 1——————Set子接口:无序,不允许重复. 2——————List子接口:有序,允许重复. Set和List对比: 1.set:检索元素的效率比较低,删除和插入效率比较高,删 ...
- Appium + python - get_attribute获取value操作
from appium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.w ...
- ThinkPHP __PUBLIC__的定义 __ROOT__等 常用 常量的定义
'__TMPL__' => APP_TMPL_PATH, // 项目模板目录 '__ROOT__' => __ROOT__, // 当前网站地址 '__APP__' => __APP ...
- SQLServer2008 关于Group by
如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成: SELECT COUNT(*) FruitName AS 水果种类, ProductPlace AS 出产国 FROM T_ ...
- Deutsch lernen (12)
1. hinweisen - wies hin - hingewiesen 向...指出,指明 auf etw.(A) hinweisen Ich möchte (Sie) darauf hiweis ...
- 通过Git向Github提交代码(Windows系统)
1.新建项目 在GitHub选择并创建一个项目.首先,登录 GitHub,单击页面右上角加号“+” ,选择“New repository” 选项. 填写项目名称及描述,默认项目为“Public”,如果 ...
- BZOJ 1108: [POI2007]天然气管道Gaz 性质分析_小结论_巧妙
Description Mary试图控制成都的天然气市场.专家已经标示出了最好的天然气井和中转站在成都的地图.现在需要将中转 站和天然气井连接起来.每个中转站必须被连接到正好一个钻油井,反之亦然. M ...
- 设置快捷键用sublime直接打开浏览器
1.安装sidebarenhancements插件 ctrl+shift+p —> Install Package —> 找到SideBarEnhancements 2.配置预览快捷键 / ...