题目链接:HDU - 4747


每次枚举右端点,加入一个数字,维护每个位置的mex,显然很复杂。
所以我们考虑每次删除一个左端点,维护前缀mex。
考虑当前位置的影响,会影响到后面大于 a[i] 的mex,会变成 a[i] ,直到下一个 a[i] ,所以线段树维护区间修改即可,因为答案是单调递增的,所以线段树区间赋值即可,不用segment beats。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10;
int n,mx[N<<2],a[N],sum[N<<2],lazy[N<<2],mex[N],cnt,pos[N],res; map<int,int> mp,vis;
#define mid (l+r>>1)
inline void push_up(int p){sum[p]=sum[p<<1]+sum[p<<1|1];mx[p]=max(mx[p<<1],mx[p<<1|1]);
}
void build(int p,int l,int r){lazy[p]=-1;if(l==r){mx[p]=sum[p]=mex[l]; return ;}build(p<<1,l,mid),build(p<<1|1,mid+1,r);push_up(p);
}
inline void upd(int p,int l,int r,int v){sum[p]=(r-l+1)*v,mx[p]=v,lazy[p]=v;}
inline void push_down(int p,int l,int r){if(lazy[p]!=-1) upd(p<<1,l,mid,lazy[p]),upd(p<<1|1,mid+1,r,lazy[p]),lazy[p]=-1;
}
void change(int p,int l,int r,int ql,int qr,int v){if(l==ql&&r==qr) return upd(p,l,r,v),void();push_down(p,l,r);if(qr<=mid) change(p<<1,l,mid,ql,qr,v);else if(ql>mid) change(p<<1|1,mid+1,r,ql,qr,v);else change(p<<1,l,mid,ql,mid,v),change(p<<1|1,mid+1,r,mid+1,qr,v);push_up(p);
}
int ask(int p,int l,int r,int ql,int qr){if(l==ql&&r==qr) return sum[p];push_down(p,l,r);if(qr<=mid) return ask(p<<1,l,mid,ql,qr);else if(ql>mid) return ask(p<<1|1,mid+1,r,ql,qr);else return ask(p<<1,l,mid,ql,mid)+ask(p<<1|1,mid+1,r,mid+1,qr);
}
int query(int p,int l,int r,int ql,int qr,int v){if(l==r) return l;push_down(p,l,r);if(qr<=mid) return query(p<<1,l,mid,ql,qr,v);else if(ql>mid) return query(p<<1|1,mid+1,r,ql,qr,v);else{if(mx[p<<1]>v) return query(p<<1,l,mid,ql,mid,v);else return query(p<<1|1,mid+1,r,mid+1,qr,v);}
}
void solve(){cnt=res=0; vis.clear(); mp.clear();for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int i=n;i>=1;i--){if(!mp.count(a[i])) pos[i]=n+1;else pos[i]=mp[a[i]];mp[a[i]]=i;}for(int i=1;i<=n;i++){vis[a[i]]=1;while(vis.count(cnt)) cnt++;mex[i]=cnt;}build(1,1,n);for(int i=1;i<=n;i++){res+=ask(1,1,n,i,n);if(ask(1,1,n,pos[i]-1,pos[i]-1)<=a[i]) continue;int p=query(1,1,n,i,n,a[i]);if(p<pos[i]) change(1,1,n,p,pos[i]-1,a[i]);}cout<<res<<endl;
}
signed main(){while(cin>>n,n) solve();return 0;
}

HDU - 4747相关推荐

  1. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  2. HDU 4747 Mex

    4747 思路: 线段树 先求出mex(1,1), mex(1, 2) , mex(1,3),...,mex(1,n)(单调上升),先将这些mex放进线段树里求和 然后再求出next[i]表示下一次出 ...

  3. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  4. HDU - 4747 Mex(线段树)

    题意: 计算    其中mex即为博弈中出现的mex(未出现的最小非负整数). 分析: 有两种方法,递推有点懵(以后再来补QAQ),就写了线段树 想法是每次求以i为起点的区间的mex值的和,最后累加即 ...

  5. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  6. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  7. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  8. DP! | 不要怂!

    跟一个博客刷: http://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 1.递推 HDU 2084 1 #include < ...

  9. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

  10. 转:动态规划题目分类

    https://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见 ...

最新文章

  1. scrollview中嵌套listview产生冲突问题
  2. Storm【压力测试】- 系列1: 进行简单的压力测试
  3. C#显示相机实时画面
  4. G6 图可视化引擎——入门教程——元素及其配置
  5. MySQL工作笔记-使用rand生成随机数及用随机数填充记录
  6. python爬取js动态网页_Python 从零开始爬虫(八)——动态爬取解决方案 之 selenium
  7. rtsp,rtp,gb28181直接转化为html5播放(二)
  8. 2021-11-17
  9. Win7 SP1 安装中文语言包
  10. iNeuOS工业互联网操作系统,设备振动状态监测、预警和分析应用案例
  11. 1483选票统计(一)(结构体专题)
  12. 论文阅读《Knowledge Graph Refinement: A Survey of Approaches and Evaluation Methods》
  13. 基于JSP的电影院售票系统
  14. 中国线上驾驶游戏市场深度研究分析报告
  15. 勾股定理计算机语言,勾股定理
  16. 有Go语言实战培训班吗?go语言开发环境搭建
  17. 第一章 Hadoop
  18. 虚拟机中linux磁盘空间不足
  19. 【OKR案例合集】财务部门及公司级 OKR 案例合集
  20. Linux 包管理基础:apt、yum、dnf 和 pkg

热门文章

  1. 题目 1035: [编程入门]自定义函数之字符类型统计
  2. opencv中step、step1、size、elemSize以及elemSize1区别
  3. 教师对php作品评语通用,期末教师给学生的评语
  4. huobi程序化交易项目
  5. Zotero使用之自定义参考文献格式
  6. 怎样用360改计算机名称,360随身wifi网络名称怎么修改
  7. 沪牌-上海牌照-拍牌经验分享: 我是如何三次拍中的?
  8. Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI、IMSI、型号、厂商等
  9. TP路由器的ip映射配置
  10. [OpenAirInterface实战-18] :OAI 软件无线电USRP B200/B210/X300/X310/N300/N310/E310比较