传送门

题意: 给nnn个数,一个kkk,求aaa中包含1−k1-k1−k且字典序最小的子序列。

思路1: 记p[i]p[i]p[i]为iii出现的最后位置,让后维护一个栈,当这个数不在栈里时将其入栈,入栈的时候跟栈顶比较,当a[i]<stk[top]且p[stk[top]]>ia[i]<stk[top] 且p[stk[top]]>ia[i]<stk[top]且p[stk[top]]>i的时候弹出栈顶,即当这个数比栈顶小且后面还有栈顶元素可以替换他的时候出栈。这样最后栈中元素即为答案。
复杂度O(n)O(n)O(n)

思路2: 用线段树维护区间中a[i]a[i]a[i]值最小的位置,让后记录一下每个数最后出现的位置,一次找kkk个数。每次查询的区间就是[pre,s.begin()][pre,s.begin()][pre,s.begin()],让后返回的位置即为当前选的数的位置,其中sss是setsetset,存每个数最后出现的位置,preprepre是上次取的数的位置+1。来讨论一下这样为什么是正确的。首先我们要字典序最小,贪心的想肯定是前面越小越好,假设序列为[4,4,2,1,3,4,1],k=3[4,4,2,1,3,4,1],k=3[4,4,2,1,3,4,1],k=3,初始的时候pre=1pre=1pre=1,s.begin()=3s.begin()=3s.begin()=3,让后我们找[1,3][1,3][1,3]最小值的下标,为什么要在[1,3][1,3][1,3]中找呢?因为333位置是222最后一次出现的位置,如果你跑[1,4][1,4][1,4]中找的话,你会选到111,这样你第一个数就是111了,而且pre=5pre=5pre=5,代表你之后都不会选到222这个数了,所以要以最后出现的位置为界,来找前面出现的最小值。让后每次都找当前区间最小值最左边的位置,让后输出即可。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,k;
int a[N];
int stk[N],top;
int p[N],cnt[N];int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) scanf("%d",&a[i]),p[a[i]]=i;for(int i=1;i<=n;i++){if(cnt[a[i]]) continue;while(top&&stk[top]>a[i]&&p[stk[top]]>i) top--,cnt[stk[top+1]]=0;stk[++top]=a[i]; cnt[a[i]]=1;}for(int i=1;i<=top;i++) printf("%d ",stk[i]); puts("");return 0;
}
/**/

2021年度训练联盟热身训练赛第一场 E Early Orders 思维 + 栈相关推荐

  1. 2021年度训练联盟热身训练赛第三场赛后补题

    2021年度训练联盟热身训练赛第三场赛后补题 A Circuit Math [题目分析] [代码展示] B Diagonal Cut [题目分析] [代码展示] C Gerrymandering [题 ...

  2. 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...

  3. 2021年度训练联盟热身训练赛第五场

    2021年度训练联盟热身训练赛第五场 链接:https://ac.nowcoder.com/acm/contest/13926 A Binary Seating #include<bits/st ...

  4. 2021年度训练联盟热身训练赛第八场

    目录 2021年度训练联盟热身训练赛第八场 A-Fire on Field 题意 思路 代码 B-Gene Tree 题意 思路 代码 I-Thread Knots 题意 思路 代码 J-Triang ...

  5. 2021年度训练联盟热身训练赛第三场(待补)

    文章目录 前言 一.Circuit Math(后缀表达式---栈&&fgets) 二.Diagonal Cut(gcd最大公因数,数论) 三.expected primary-expr ...

  6. 2021年度训练联盟热身训练赛第一场 H题On Average They‘re Purple(BFS)

    题意: 给你一些联通关系,问Bob先选择一些路径(1~n)联通,Alice在路径上染色,Bob的目的是选择一些路径使得染色变化最小,对于Alice来说,需要使得在Bob选择的(1−n1-n1−n)d的 ...

  7. 2021年度训练联盟热身训练赛第一场 A.Weird Flecks, But OK (最小覆盖圆)

    题目链接: A.Weird Flecks, But OK 题解 从XOY.YOZ.XOZ三个面,寻找最小圆覆盖,只要满足存在一个面的点被圆覆盖即可,答案就是每个面的最小圆的最小值. 代码 #inclu ...

  8. 2021年度训练联盟热身训练赛第一场 (除G,K外所有)

    传送门 A Weird Flecks, But OK An artist who wanted to create an installation where his works appeared t ...

  9. J.This Ain‘t Your Grandpa‘s Checkerboard (简单遍历)(2021年度训练联盟热身训练赛第一场)

    传送门 题目要求: ①每一行的黑色方块数量相等  ②每一列的黑色与白色的方块数相等   ③ 每一行或列没有连续3个会以上的相同色块. 思路:直接遍历统计一遍即可. 代码实现: #include< ...

最新文章

  1. NBT:牛瘤胃微生物组的4941个宏基因组组装基因组(MAG)
  2. Java 的 IO 很复杂?用思路带领你去battle他!
  3. video自动全屏播放
  4. vue+elementUI 添加多个可以全选的多选框
  5. linux跨ip拷贝,Linux的虚拟机拷贝到另外的操作系统时,NAT方式的静态IP无效,一直是获取的DHCP动态地址...
  6. 十篇论文攻克自然语言处理底层原理!推荐大家复现!
  7. matplotlib画图一行三个图
  8. atitit.事件驱动的总结attilax
  9. java 车牌识别系统_java车牌识别系统 自动识别车牌系统的工作原理
  10. tableau入门视频笔记(一)
  11. catboost原理
  12. 漫步微积分二十二——微分方程和分离变量法
  13. 同学,你这简历上没项目啊!
  14. 网吧收银费用计算的对象及算法设计
  15. cpu对计算机性能的影响,雷神告诉你CPU制程对性能的影响有多大?
  16. bios 刷 灵耀14_华硕笔记本刷完BIOS后一直进不去系统,怎么解决?
  17. 全面认识二极管,一篇文章就够了
  18. 休眠 鼎鼎机器人_COC部落冲突鼎鼎机器人
  19. R语言github软件的两种安装方式
  20. {2018.4.21}荀(gou)彧(huo)同学的函数与排序整合

热门文章

  1. pads中如何设置等长_期货如何设置止损止盈避免交易中被套-期货学习
  2. 爱因斯坦为什么不是普通人?看他怎么喝茶就明白了,差距太明显了!没法比.......
  3. 网友半夜差点被沐浴露吓死,众人:原来不止我胆小....
  4. 中小学招生强化就近入学;首次全女性太空行走取消;苹果付费新闻APP奔溃;NASA火星上发现鹅卵石;这就是今天的大新闻...
  5. python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?
  6. c#web服务器 虚拟目录,C#建立自己的Web服务器
  7. 大神讲解Java for循环的几种用法
  8. 新编计算机英语第六章,新编计算机英语-电子教案.ppt
  9. tcl mysql_MySQL·TCL语言
  10. linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7