Educational Codeforces Round 35 E. Stack Sorting 模拟

Educational Codeforces Round 35

E. Stack Sorting

题意:长度为 n 的序列 a[] ,a[] 里的数是 1~n,一个空栈 s,一个空序列 b[]。两个操作:把 a[] 的第一个数放到 s 里; 或者把 s 的栈顶元素加到 b[] 的末尾。

如果你能通过这两个操作把 a[] 的数最后都放入 b[] 中,且 b[] 是升序的,那就可说 a[] 是 stack-sortable 。

现在给出 a[] 的前 k 个数,要你确定是否有满足 stack-sortable 条件的 a[] 。如果有,输出字典序最大的。

tags:好苟的题。。

其实大体的思路很好想,就是 a[] 里会出现 " 中 、大、小 " 这样顺序的就是不可能。

但最苟的是后面 n-k 个数应该怎么输出,这里挖了好几发。。。

把前 k 个数从小到大排序后,变为 a1, a2, ...... ak 。 后面 n-k 个数,先输出 a1->1,再是 a2 -> a1, 再是 a3->a2, a4->a3 ........,ak -> a(k-1), n -> ak 。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 200005;

int n, k, p[N], mi[N], bit[N];
bool vis[N];
void Add(int x, int y)
{
    for(int i=x; i<N; i+=i&-i)
        bit[i] += y;
}
int Sum(int x)
{
    int ans = 0;
    for(int i=x; i>0; i-=i&-i)
        ans += bit[i];
    return ans;
}
int main()
{
    mes(mi, INF);
    scanf("%d%d", &n, &k);
    int mm = INF, mx = 0;
    rep(i,1,k)
    {
        scanf("%d", &p[i]);
        vis[p[i]]=true;
        mm = min(mm, p[i]);
        mx = max(mx, p[i]);
    }
    mi[k] = p[k];
    rep(i,1,n)
        if(!vis[i]) {
            mi[k] = min(mi[k], i);
            mi[k+1] = i;
            break;
        }
    per(i,k-1,1)
        mi[i] = min(mi[i+1], p[i]);
    Add(p[1], 1);
    rep(i,2,k)
    {
        Add(p[i], 1);
        int tmp = Sum(p[i]-1) - Sum(mi[i+1]);
        if(tmp > 0) return 0*printf("-1\n");
    }
    rep(i,1,k) printf("%d ", p[i]);
    sort(p+1, p+1+k);
    per(j,p[1]-1,1)
        printf("%d ", j);
    rep(i,1,k-1)
    {
        per(j,p[i+1]-1,p[i]+1)
            printf("%d ", j);
    }
    per(j,n,p[k]+1)
        printf("%d ", j);

    return 0;
}

原文地址:https://www.cnblogs.com/sbfhy/p/8146545.html

时间: 2024-11-08 00:15:38

Educational Codeforces Round 35 E. Stack Sorting 模拟的相关文章

Educational Codeforces Round 67 D. Subarray Sorting

Educational Codeforces Round 67 D. Subarray Sorting 传送门 题意: 给出两个数组\(a,b\),现在可以对\(a\)数组进行任意次排序,问最后能否得到\(b\)数组. \(n\leq 3*10^5,a\leq n.\) 思路: 首先注意到任意次排序可以等价于任意次交换两个相邻的数,当且仅当前一个数不小于后面一个数. 我一开始想的是按权值从小到大来构造,但最终发现这条路走不通. 正解就是比较直接的思路,按位置一个一个来匹配. 对于一个\(b_i\

Educational Codeforces Round 35 (Rated for Div. 2)

A. Nearest Minimums You are given an array of n integer numbers a0,?a1,?...,?an?-?1. Find the distance between two closest (nearest) minimums in it. It is guaranteed that in the array a minimum occurs at least two times. Input The first line contains

【Educational Codeforces Round 35 A】 Nearest Minimums

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找出最小的数字的位置. 最近的肯定是相邻的某对. [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e5; int n; int a[N+10],mi; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif io

【Educational Codeforces Round 35 D】Inversion Counting

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 排列中交换任意两个数字. 排列的逆序对个数的奇偶性会发生变化. 翻转这个过程其实就是len/2对数字发生交换. 交换了偶数次的话,不变,否则奇偶性发生改变. 先暴力求出一开始的逆序对个数就好 [代码] #include <bits/stdc++.h> using namespace std; const int N = 1500; int n,a[N+10],cnt,now,m; void out(int x){ if (x=

【Educational Codeforces Round 35 C】Two Cakes

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 直觉题. 感觉情况会很少. 毕竟间隔太大了.中间肯定有一些数字达不到. 有1肯定可以 2 2 x肯定可以 3 3 3也可以 2 4 4也可以. 就这样 [代码] #include <bits/stdc++.h> using namespace std; vector <int> v; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", &

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

Educational Codeforces Round 25 G. Tree Queries

题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一个操作是这个. 2 x 询问x到任意黑色的点的简单路径上的最小节点编号. 题解: 首先将一个变为黑色的点当成树根,然后dfs一下,预处理出所有点的答案. 然后开一个变量记录一下当前变黑的点的答案cur=min(cur,dp[x]). 每次询问的时候答案就是min(cur,dp[x]). 如果觉得很神

Educational Codeforces Round 69 (Rated for Div. 2) B - Pillars

Educational Codeforces Round 69 (Rated for Div. 2) B - Pillars There are n pillars aligned in a row and numbered from 1 to n. Initially each pillar contains exactly one disk. The i-th pillar contains a disk having radius ai. You can move these disks

Educational Codeforces Round 71 (Rated for Div. 2) A - There Are Two Types Of Burgers

原文链接:https://www.cnblogs.com/xwl3109377858/p/11404050.html Educational Codeforces Round 71 (Rated for Div. 2) A - There Are Two Types Of Burgers There are two types of burgers in your restaurant — hamburgers and chicken burgers! To assemble a hamburg