Early Orders单调栈

2023-11-17

链接

题目描述
在这里插入图片描述

You are given a list of integers n and a number k.
It is guaranteed that each i from 1 to k appears in the list at least once.

Find the lexicographically smallest subsequence of x that contains
each integer from 1 to k exactly once.

输入描述:
在这里插入图片描述

输出描述:

Write out on one line, separated by spaces, the lexicographically smallest
subsequence of x that has each integer from 1 to k exactly once.

示例1
输入

6 3
3
2
1
3
1
3

输出
2 1 3
示例2
输入

10 5
5
4
3
2
1
4
1
1
5
5

输出
3 2 1 4 5

大体思路:
用pos数组来记录每个数出现的最后的位置
然后遍历每一个数组元素,如果当前元素已经被标记过了(已经被使用),那么就跳过这次循环
设遍历数组元素的时候,将这个数组的下标记为 i ,值的大小为 x
当栈里面有元素,并且栈顶的元素大于x,并且栈顶这个数最后出现的位置大于当前这个数最后出现的位置 i ,那么说明栈里面这一数列就不是最优的,就可以将当前的元素x替换掉栈顶元素,先pop(),然后将这个数标记为 0 ,–>未使用
如果当上述条件一直满足的时候,可以一直进行上面的操作
知道不满足题意,然后讲当前这个数放到栈的顶端
得到的数列一定是与答案相反的,如果是用数组模拟,可以直接按照顺序输出前面的m个元素
如果使用STL,可以再开一个栈倒置一下,然后输出前面的m个元素,即为答案

细节:用stl封装的栈在取用栈顶端的元素的时候应该考虑到当前栈是不是有元素,否则会报错
用数组模拟栈的时候,要考虑到数组下标的问题,否则也会导致出错
关于为什么要考虑到站定这个数最后出现的位置大于当前这个数最后出现的位置 : ->因为满足这个条件的时候,后面的元素还有机会再次进入栈中(后面还会出现这个数,还能进入栈),否则没有机会进入栈中会影响答案

int n,m;
stack<int> st;
int a[maxn];
int pos[maxn];
map<int,bool> mp;
int main()
{
    cin >> n >> m;
    for(int i=1; i<=n; i++) {
        a[i] = read;
        pos[a[i]] = i;
    }
    for(int i=1;i<=n;i++){
        if(mp[a[i]]) continue;
        while(st.size() && st.top() > a[i] && pos[st.top()] > i) {
            int tp = st.top();
            st.pop();
            mp[tp] = 0;
        }
        st.push(a[i]);
        mp[a[i]] = 1;
    }
    stack<int> st2;
    while(st.size()){
        st2.push(st.top());
        st.pop();
    }
    for(int i=1;i<=m;i++){
        printf("%d ",st2.top());
        st2.pop();
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Early Orders单调栈 的相关文章

  • 蓝桥杯2020年第十一届国赛真题-重复字符串

    说在前面 本题的标程是存在问题的 下面会分析标程与正确程序 题目 题目连接 题解 思维吧 整体思路 将字符串分割成k段 假设每段m个字符 我们统计每段相同位置的每种字符出现的次数 每段都统计上后 每个位置 0 m 1 都取出现次数最多的字符
  • 染色——差分数组板子题

    问题描述 有编号为0到M 的 M 1 个格子 现在有N个操作 x y 表示将从x 到 y的格子染色 问一共有多少个格子被染色 输入 第一行两个整数 分别表示N和M 接下来有N行 每行两个整数 分别表示x和y 输出 输出一个整数 表示有多少个
  • 2021杭电多校第三场-Road Discount-wqs二分+最小生成树

    Description There are n cities in Byteland labeled by 1 to n The Transport Construction Authority of Byteland is plannin
  • 2017年蓝桥杯B组C/C++省赛-K倍区间

    题目 题解 思维 暴力的话是会超时的 但也可以骗点分 采用差分数组暴力 讲一下AC思路 统计出来每个前缀和取模 k k k后结果的个数 比如 c n t
  • UPC-混合训练第十五场

    gift 题目描述 战争结束 A国和B国的元首决定两国友好相处 于是城市之间就有互相送礼的情况 参与这次相互协助计划中有n个A国的城市和m个B国的城市 作为A国的重臣 小Q了解到每一个A国的城市送出了ai份礼物 B国的城市收到了bi份礼物
  • 2021-07-21训练日记upc联通数(思维)

    A 联通数 题目描述 数学高手小G最近发现了一种新型的数 他首先在草稿纸写下任意长度的数字串kkkkkkkkkkk 1 k 9 并在其中间添加加号 且相邻两个加号之间至少含有两个数字k 默认数字串第一个数字前与最后一个数字后也有两个加号 然
  • 2020年蓝桥杯国赛-答疑

    题目 题目链接 题解 贪心 有点像 排队打水 比较好想 而且我甚至都能证明 贪心思路 按照 s a e s a e s a e 从小到大排序即可 证明 首先 每个人的
  • [HDU 4738] Caocao‘s Bridges

    Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi But he wouldn t give up Caocao
  • Codeforces 1554C - Mikasa MEX

    input 5 3 5 4 6 3 2 69 696 123456 654321 output 4 3 0 640 530866 给出n m从n 0 gt n m中最小为出现的非负整数 int main int read while int
  • 1010 Radix (25 分)

    题目 题目链接 题解 二分 数学 先说几点注意事项 开 LL 最高进制不是35 可以更高 枚举可能的进制时存在爆LL的情况 整体思路 先计算出知道进制的那个数对应的十进制数 二分进制 找到某个进制使得另一个数对应的十进制数与已知的十进制数相
  • Codeforces Round #723 (Div. 2)B. I Hate 1111

    Description You are given an integer x Can you make x by summing up some number of 11 111 1111 11111 You can use any num
  • Group Project-思维

    链接 来源 牛客网 题目描述 The big day has fifinally arrived today you are going to form groups of two in which you will do the end
  • [leetcode] 1675. 数组的最小偏移量

    题目链接 来源 力扣 LeetCode 链接 https leetcode cn problems minimize deviation in array 著作权归领扣网络所有 商业转载请联系官方授权 非商业转载请注明出处 示例 1 输入
  • edu99 div.2 Sequence and Swaps优雅的暴力

    time limit per test1 5 seconds memory limit per test512 megabytes inputstandard input outputstandard output Example inpu
  • UPC思维题--移动

    题目描述 考虑333的立方体 有六个面 每个面有九个正方形 染色方法如下 角上的方格是red 中心是green 其他为blue 初始有一个机器人站在立方体顶面中心 面朝一个blue方格 它将接受到一系列如下指令 L 左转90度 R 右转90
  • 2021蓝桥杯模拟赛-删除字符

    题目 题目链接 题解 贪心 贪心思路 将整个字符串视为若干段降序排列的子串 即 从左边开始向右遍历 遇到逆序的就删除 再对新的串从头遍历找逆序 不停地重复整个过程是为了保证删除的尽可能靠前 贪心 如果整个字符串都顺序了 但是还要删 那么就从
  • 2017年蓝桥杯B组C/C++省赛-分巧克力

    题目 题目链接 题解 二分 想到二分比实现二分要难点 可行解部分可以与不可行解部分完美地分隔开来 绿色部分是分成的巧克力比较小时都可以满足 而大于一定程度的时候就不可行了 所以可以将其抽象成小于可行 大于不可行的二分问题 在判断时 遍历全部
  • 蓝桥杯2019年第十届省赛真题-Fibonacci 数列与黄金分割

    题目 题目链接 题解 我未曾设想的道路 我居然以为是高精度的矩阵快速幂 差点心态崩了 直接看了题解 1 50 打个表 发现到20 小数点后八位就不变了 所以 解决 代码 include
  • Early Orders单调栈

    链接 题目描述 You are given a list of integers n and a number k It is guaranteed that each i from 1 to k appears in the list a
  • Educational Codeforces Round 98 (Rated for Div. 2)B-Toy Blocks

    B Toy Blocks time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Y

随机推荐