题目链接:点击查看

题目大意:给出一个长度为 n 的排列,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 的 mex

题目分析:算是一道比较经典的题目了吧,先说一般做法,一般做法是 nlogn 的主席树,或者离线线段树,或者是 nsqrt( n ) 的莫队,这里我选择了比较好理解的主席树存一下,主席树的话就是每一个版本的线段树储存一下 [ 1 , i ] 中每个数字最后一次出现的位置,这样每次查询 [ l , r ] ,只需要在第 r 个版本的线段树中查询最小的那个没有出现的数字即可

而这个题目给的恰好是一个 n 的排列,也就是任意两个数都互不相同,这样就可以稍微思考一下优化为 O( n ) 的了,可以从前到后以及从后到前维护两个数组,mmin1 代表的是前缀最小值,mmin2 代表的是后缀最小值,每次对于 [ l , r ] 的查询来说,mmin1[ l - 1 ] 和 mmin2[ r + 1 ] 的最小值就是答案了,想一下是不是非常巧妙

代码:

主席树

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;struct Node
{int l,r;int sum;
}tree[N*20];int cnt,root[N];void init()
{root[0]=0;tree[0].l=tree[0].r=tree[0].sum=0;cnt=1;
}void update(int num,int &k,int l,int r)
{tree[cnt++]=tree[k];k=cnt-1;tree[k].sum++;if(l==r)return;int mid=l+r>>1;if(num<=mid)update(num,tree[k].l,l,mid);elseupdate(num,tree[k].r,mid+1,r);
}int query(int i,int j,int l,int r)
{int d=tree[tree[j].l].sum-tree[tree[i].l].sum;if(l==r)return l;int mid=l+r>>1;if(d<(mid-l+1))return query(tree[i].l,tree[j].l,l,mid);elsereturn query(tree[i].r,tree[j].r,mid+1,r);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int num;scanf("%d",&num);root[i]=root[i-1];update(num+1,root[i],1,n);}while(m--){int l,r;scanf("%d%d",&l,&r);if(l==1&&r==n)printf("%d\n",n);elseprintf("%d\n",query(root[l-1],root[r],1,n)-1);}return 0;
}

思维

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;int mmin1[N],mmin2[N],a[N];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",a+i);mmin1[0]=mmin2[n+1]=n;for(int i=1;i<=n;i++)mmin1[i]=min(mmin1[i-1],a[i]);for(int i=n;i>=1;i--)mmin2[i]=min(mmin2[i+1],a[i]);while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",min(mmin1[l-1],mmin2[r+1]));}return 0;
}

牛客 - 牛牛的mex(主席树/思维)相关推荐

  1. 牛客 Cutting Bamboos (主席树)

    题解 - 牛客 Cutting Bamboos (主席树) 题目链接: https://ac.nowcoder.com/acm/contest/889/H 题意: 给你一些竹子,q个询问,问你从第l到 ...

  2. 牛客 - 牛牛的最大兴趣组(思维+数论)

    题目链接:点击查看 题目大意:给出 nnn 个数,要求选出最多的数,使得任意两个数的乘积不能是三次平方数,三次平方数,诸如23=8,33=272^3=8,3^3=2723=8,33=27 题目分析:这 ...

  3. 牛客 牛牛浇树(差分)

    文章目录 1. 题目 2. 解题 1. 题目 链接:https://ac.nowcoder.com/acm/contest/10323/A 来源:牛客网 牛牛现在在花园养了n棵树,按顺序从第1棵到第n ...

  4. CodeForces - 813E Army Creation(主席树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti​ 为数字 ...

  5. 牛客 - 阔力梯的树(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号,现在规定每个节点的"结实程度"为其子树中所有的编号排序后相邻两个数之差的平方和,现在需要求出每个节点的"结 ...

  6. 【牛客 - 157D】插排树(dfs,树形dp)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/D 来源:牛客网 一年一度的山东省oi夏令营又开始了,每到这个季节,山东的oier们都会欢聚这里,一起学( ...

  7. 牛客 牛牛选物(01背包)

    文章目录 1. 题目 2. 解题 1. 题目 链接:https://ac.nowcoder.com/acm/contest/9887/A 来源:牛客网 牛牛有现在有n个物品,每个物品有一个体积v[i] ...

  8. 牛客 牛牛的独特子序列(双指针/二分查找)

    文章目录 1. 题目 2. 解题 2.1 双指针 2.2 二分查找 1. 题目 链接:https://ac.nowcoder.com/acm/contest/9752/B 来源:牛客网 牛牛现在有一个 ...

  9. 牛客 牛牛爱喝酒(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 链接:https://ac.nowcoder.com/acm/contest/9752/A 来源:牛客网 牛牛是一个酒鬼,非常爱喝酒, 一瓶酒m元钱, 两 ...

最新文章

  1. EasyUI DataGrid根据字段动态合并单元格
  2. 深入地下,实地探访!不用人挖煤的智能煤矿长什么样?
  3. 电子火折子的原理,了解一下?
  4. .NET 6新特性试用 | 异步流
  5. 《信息学奥赛一本通 提高篇》
  6. Entity Framework Codefirst的配置步骤
  7. 采用install.sh安装脚本进行快速安装astercc
  8. php variables,浅析PHP原理之变量(Variables inside PHP)
  9. 编程学习记录11:Oracle数据库的一些基本操作1,创建用户,授权
  10. 怎样修改管家婆服务器密码,管家婆辉煌版如何设置权限和修改操作员密码口令...
  11. Ae 内置效果控件(合集)
  12. JAVA 用enum 来枚举java项目中的错误信息
  13. twig php函数,TWIG的 function 学习
  14. 高鲁棒!高实时!慕尼黑工业大学开源RGB-L SLAM!
  15. 设置服务器可以多人同时远程访问
  16. webx的一些不解解惑
  17. RabbitMQ内存消耗
  18. php抓取curl下载文件,PHP 利用 Curl 函数实现多线程抓取网页和下载文件
  19. 图扑软件 | 虚拟电厂负荷控制系统可视化
  20. #软件设计师 #软考 #高频知识点总结 #上午题常考知识点 #下午题分析总结

热门文章

  1. gephi java教程_Gephi的使用--以社交网络图为例
  2. 运行过程中的leader选举
  3. 定时任务 - 定时关闭超期未支付订单
  4. Collections集合工具类的方法_addAllshuffle
  5. 如何防止机器模拟请求
  6. 整合Tomcat和Nginx实现动静态负载均衡
  7. redis(12)--事件,客户端,服务器
  8. sqlconfigdatasource mysql_MFC odbc 连接MySQL 的 (SQLConfigDataSource动态DSN)
  9. Git、TortoiseGit、GitHub、Gitee、GitLab 安装与入门使用
  10. c++基础入门(根据浙大翁恺老师视频整理)