正题

题目链接:http://codeforces.com/contest/1628/problem/A


题目大意

给出一个长度为nnn的序列aaa和一个空序列bbb,你每次可以选择aaa的一个前缀,将它的mexmexmex加入序列bbb的末尾,然后将aaa的这个前缀删除。

求bbb的最大字典序。

1≤∑n≤2×105,0≤ai≤n1\leq \sum n\leq 2\times 10^5,0\leq a_i\leq n1≤∑n≤2×105,0≤ai​≤n


解题思路

显然地我们每次肯定要选mexmexmex最大的一个前缀,为了最大化我们后面的值,那么我们显然是选的前缀越短越好。

而考虑如何快速求到这个前缀,我们可以考虑从小到大枚举这个mexmexmex的值,假设现在枚举到xxx,那么证明我们得到的前缀1∼r1\sim r1∼r之中已经有0∼x−20\sim x-20∼x−2了,我们就先看这个前缀中是否有x−1x-1x−1,如果有就枚举下一个数,不然我们就让rrr跳到第一个xxx处。

显然这样一次的复杂度是O(mexlog⁡n)O(mex\log n)O(mexlogn)的,但是因为删除的数字个数和mexmexmex同级,而一个数字最多被删除一次,这样时间复杂度就是O(nlog⁡n)O(n\log n)O(nlogn)了。

写个vectorvectorvector上二分就好了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=2e5+10;
int T,n;vector<int> v[N],mex;
int lb(int x,int L){int l=0,r=v[x].size()-1;while(l<=r){int mid=(l+r)>>1;if(v[x][mid]<=L)l=mid+1;else r=mid-1;}return (l>=v[x].size())?(n+1):v[x][l];
}
int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);mex.clear();for(int i=0;i<=n;i++)v[i].clear();for(int i=1,x;i<=n;i++){scanf("%d",&x);v[x].push_back(i);}int l=0;while(l<n){int r=l+1;for(int i=0;i<=n;i++){int p=lb(i,l);if(p>n){mex.push_back(i);break;}r=max(p,r);}l=r;}printf("%d\n",mex.size());for(int i=0;i<mex.size();i++)printf("%d ",mex[i]);putchar('\n');}
}

CF1628A-Meximum Array【二分】相关推荐

  1. 【Codeforces Round #767 (Div. 2)】 C. Meximum Array 题解

    [Codeforces Round #767 (Div. 2) ]C. Meximum Array 题解 1629C: Meximum Array 题解 [Codeforces Round #767 ...

  2. 二分查找(java)

    /*** TODO*/ package com.xeezee.array;/*** 二分查找法* * @author luoqinglong* @date 2012-7-30*/ public cla ...

  3. 周总结2022.1.17-2022.1.23

    1.17 Luogu P3384 [模板]轻重链剖分/树链剖分 学习了树链剖分(Lint-cut Tree)! 虽然之前也有看过,但是今天是第一次自己动手写.学完之后,感觉是一个非常巧妙的东西.树链剖 ...

  4. 常见数据结构与算法整理总结(下)

    原文链接:https://www.jianshu.com/p/42f81846c0fb 这篇文章是常见数据结构与算法整理总结的下篇,上一篇主要是对常见的数据结构进行集中总结,这篇主要是总结一些常见的算 ...

  5. [转载] java语言程序设计-基础篇

    参考链接: Java中的决策制定(if,if-else,switch,break,continue,jump) 第1章,计算机.程序和Java概述 包括[每个java初学者都应该搞懂的问题] http ...

  6. 常见数据结构与算法整理总结

    转载:http://www.jianshu.com/p/42f81846c0fb?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=to ...

  7. jsjq面试笔记(下)

    js&jq面试笔记,该部分为下部分. 字符串相关 1.定义一个方法,用于将string中的每个字符之间加一个空格,并输出 如:'hello' -> 'h e l l o'function ...

  8. 老男孩上海校区Python面试题

    python面试题 第一章:python基础 数据类型: 1 字典: 1.1 现有字典 dict={'a':24,'g':52,'i':12,'k':33}请按字典中的 value 值进行排序? 1. ...

  9. 狂神说Java--Java学习笔记(基础合集)

    笔记参考来源狂神说Java视频https://www.bilibili.com/video/BV12J41137hu 本篇笔记有点长,可以根据目录定位,建议配合视频学习. 预科 什么是计算机 名称:C ...

  10. java语言程序设计-基础篇

    第1章,计算机.程序和Java概述 包括[每个java初学者都应该搞懂的问题] http://blog.csdn.net/haobo920/article/details/5784990 1,java ...

最新文章

  1. 1命名规则 sentinel_Spring Cloud Alibaba 整合 Sentinel 流控
  2. 2021fall Bloomberg校招
  3. openssh windows_WINDOWS环境配置SSH服务
  4. Android在桌面上添加开关,多键开关 Andromax v1.1.7
  5. ThreadLocal实践
  6. hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)...
  7. 美摄智能生产平台,轻松搞定视频制作——对话美摄科技研发总监黄裔
  8. 8数据提供什么掩膜产品_工业轨式1-8路RS485数据(MODBUS RTU协议)厂家产品说明...
  9. The 15th UESTC Programming Contest Preliminary H - Hesty Str1ng cdoj1551
  10. 数学哲学与科学哲学和计算机科学的能动作用,数学哲学与科学哲学和计算机科学的能动作用...
  11. pip安装第三方库以及版本
  12. SSL-Explorer 安装配置
  13. 遇到错误怎么办:ndk-build.cmd‘‘ finished with non-zero exit value 2
  14. 【游戏】基于matlab GUI音乐闹钟设计【含Matlab源码 1105期】
  15. 浅谈URI和URL的区别
  16. 使用kettle进行数据清洗
  17. 高效能人士的七个习惯的简要定义与架构图
  18. 有点意思!“古董级” 诺基亚功能机跑 Linux
  19. ckeditor引入
  20. tcpdump输出内容分析

热门文章

  1. position定位 响应式_使用 Vue3 实现双盒子定位 Overlay
  2. python json方法详解_python详解json模块
  3. phpstorm设置 打开文件所在目录_PDF文件在线分享并设置打开次数
  4. 5120v2怎么配置web登陆_阿里企业邮箱如何配置和添加到第三个电子邮件客户端中?...
  5. vs里面mfc是什么_最近!一大批人正在前往文安,究竟发生了什么?
  6. 算法题目——省份数量(dfs,bfs)
  7. 汉诺塔问题详细解析zufeoj
  8. msf payload php,Metasploit(四)--Msfpayload命令
  9. leetcode1005. K 次取反后最大化的数组和
  10. leetcode454. 四数相加 II(思路+详解)