Codeforces 911E Stack Sorting (模拟)
2018-01-18 20:44
344 查看
E. Stack Sorting
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Let's suppose you have an array a, a stack s (initially
empty) and an array b (also initially empty).
You may perform the following operations until both a and s are
empty:
Take the first element of a, push it into s and
remove it from a (if a is
not empty);
Take the top element from s, append it to the end of array b and
remove it from s (if s is
not empty).
You can perform these operations in arbitrary order.
If there exists a way to perform the operations such that array b is sorted in non-descending order in the end, then array a is
called stack-sortable.
For example, [3, 1, 2] is stack-sortable, because b will
be sorted if we perform the following operations:
Remove 3 from a and
push it into s;
Remove 1 from a and
push it into s;
Remove 1 from s and
append it to the end of b;
Remove 2 from a and
push it into s;
Remove 2 from s and
append it to the end of b;
Remove 3 from s and
append it to the end of b.
After all these operations b = [1, 2, 3], so [3, 1, 2] is stack-sortable. [2, 3, 1] is
not stack-sortable.
You are given k first elements of some permutation p of
size n (recall that a permutation of size n is
an array of size n where each integer from 1 to n occurs
exactly once). You have to restore the remaining n - k elements of this permutation so it is stack-sortable.
If there are multiple answers, choose the answer such that p is lexicographically maximal (an array q is
lexicographically greater than an array p iff there exists some integer k such
that for every i < k qi = pi,
and qk > pk). You
may not swap or change any of first k elements of the permutation.
Print the lexicographically maximal permutation p you can obtain.
If there exists no answer then output -1.
Input
The first line contains two integers n and k (2 ≤ n ≤ 200000, 1 ≤ k < n)
— the size of a desired permutation, and the number of elements you are given, respectively.
The second line contains k integers p1, p2,
..., pk (1 ≤ pi ≤ n)
— the first k elements of p.
These integers are pairwise distinct.
Output
If it is possible to restore a stack-sortable permutation p of size n such
that the first k elements of p are
equal to elements given in the input, print lexicographically maximal such permutation.
Otherwise print -1.
Examples
input
output
input
output
input
output
input
output
题目链接:http://codeforces.com/contest/911/problem/E
题意:有n个数,其中k个数给定你入栈顺序(即数组a[]中存储的元素),剩余n-k个元素的输入顺序由你自己决定,使得n个元素的出栈顺序为升序。如果有多种答案,则输出入栈顺序字典序最大的一种。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n,k,a
,vis
,top,b
,num;
int main(){
scanf("%d%d",&n,&k);
for(int i = 0; i < k; i ++) scanf("%d",&a[i]);
num = 1;
for(int i = 0; i < k; i ++){
vis[a[i]] = 1;
b[++ top] = a[i];
while(top && b[top] == num) top --, num ++;
}
int flag = 0;
for(int i = 1; i < top; i ++){
if(b[i] < b[i+1]){
flag = 1; break;
}
}
if(flag) printf("-1\n");
else{
for(int i = 0; i < k; i ++){
if(i) printf(" ");
printf("%d",a[i]);
}
b[top+1] = num-1;
while(top > 0){
for(int i = b[top]-1; i > b[top+1]; i --) printf(" %d",i);
top --;
}
for(int i = n; i > b[top+1]; i --) printf(" %d",i);
printf("\n");
}
return 0;
}
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Let's suppose you have an array a, a stack s (initially
empty) and an array b (also initially empty).
You may perform the following operations until both a and s are
empty:
Take the first element of a, push it into s and
remove it from a (if a is
not empty);
Take the top element from s, append it to the end of array b and
remove it from s (if s is
not empty).
You can perform these operations in arbitrary order.
If there exists a way to perform the operations such that array b is sorted in non-descending order in the end, then array a is
called stack-sortable.
For example, [3, 1, 2] is stack-sortable, because b will
be sorted if we perform the following operations:
Remove 3 from a and
push it into s;
Remove 1 from a and
push it into s;
Remove 1 from s and
append it to the end of b;
Remove 2 from a and
push it into s;
Remove 2 from s and
append it to the end of b;
Remove 3 from s and
append it to the end of b.
After all these operations b = [1, 2, 3], so [3, 1, 2] is stack-sortable. [2, 3, 1] is
not stack-sortable.
You are given k first elements of some permutation p of
size n (recall that a permutation of size n is
an array of size n where each integer from 1 to n occurs
exactly once). You have to restore the remaining n - k elements of this permutation so it is stack-sortable.
If there are multiple answers, choose the answer such that p is lexicographically maximal (an array q is
lexicographically greater than an array p iff there exists some integer k such
that for every i < k qi = pi,
and qk > pk). You
may not swap or change any of first k elements of the permutation.
Print the lexicographically maximal permutation p you can obtain.
If there exists no answer then output -1.
Input
The first line contains two integers n and k (2 ≤ n ≤ 200000, 1 ≤ k < n)
— the size of a desired permutation, and the number of elements you are given, respectively.
The second line contains k integers p1, p2,
..., pk (1 ≤ pi ≤ n)
— the first k elements of p.
These integers are pairwise distinct.
Output
If it is possible to restore a stack-sortable permutation p of size n such
that the first k elements of p are
equal to elements given in the input, print lexicographically maximal such permutation.
Otherwise print -1.
Examples
input
5 3 3 2 1
output
3 2 1 5 4
input
5 3 2 3 1
output
-1
input
5 1 3
output
3 2 1 5 4
input
5 2 3 4
output
-1
题目链接:http://codeforces.com/contest/911/problem/E
题意:有n个数,其中k个数给定你入栈顺序(即数组a[]中存储的元素),剩余n-k个元素的输入顺序由你自己决定,使得n个元素的出栈顺序为升序。如果有多种答案,则输出入栈顺序字典序最大的一种。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n,k,a
,vis
,top,b
,num;
int main(){
scanf("%d%d",&n,&k);
for(int i = 0; i < k; i ++) scanf("%d",&a[i]);
num = 1;
for(int i = 0; i < k; i ++){
vis[a[i]] = 1;
b[++ top] = a[i];
while(top && b[top] == num) top --, num ++;
}
int flag = 0;
for(int i = 1; i < top; i ++){
if(b[i] < b[i+1]){
flag = 1; break;
}
}
if(flag) printf("-1\n");
else{
for(int i = 0; i < k; i ++){
if(i) printf(" ");
printf("%d",a[i]);
}
b[top+1] = num-1;
while(top > 0){
for(int i = b[top]-1; i > b[top+1]; i --) printf(" %d",i);
top --;
}
for(int i = n; i > b[top+1]; i --) printf(" %d",i);
printf("\n");
}
return 0;
}
相关文章推荐
- Codeforces 888B Buggy Robot (模拟)
- Codeforces 745B (模拟)
- Codeforces 523C&D C.Name Quest【贪心】、D.Statistics of Recompressing Videos【模拟】
- Codeforces 716 B Complete the Word【模拟】
- codeforces 141A Amusing Joke(模拟水题)
- CodeForces - 825D Suitable Replacement(简单模拟)
- Codeforces 166C Median 暴力模拟
- 【模拟退火】最小球POJ 2069/codeforces 82 E
- codeforces 750-C. New Year and Rating(模拟)
- CodeForces 388A Fox and Box Accumulation (模拟)
- CodeForces 448B 小模拟
- Codeforces 911E 简单模拟
- Codeforces 680B Bear and Finding Criminals【模拟】
- CodeForces 589D Boulevard (模拟)
- CodeForces 730A Toda 2 (模拟)
- Codeforces 449A 模拟
- CodeForces 260A Adding Digits 模拟
- 【模拟】Codeforces 706A Beru-taxi
- CodeForces - 868B Race Against Time(模拟)
- codeforces-508C -鬼吹灯(巧妙模拟)