[HDU 4747] Mex (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747
这道题是我去年刚入校队的时候参加网赛的题目。
一年过去了,我依然还是不会做。。
这是我难题计划的开始吧。。
竟然还敲挫了,自己真是弱。
题意:
给你一个数列a,定义Mex[L,R]为a[L,R]中没有出现过的最小的自然数。求1<=l<=r<=n的所有Mex[l,r]之和。
解法我也是看了解题报告才知道的。
请参看cxlove大神的博文:http://blog.csdn.net/acm_cxlove/article/details/11749383
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std; typedef long long LL;
typedef pair<int,int> PII;
const int MAX_N = 2e5+;
LL delta[MAX_N<<],sum[MAX_N<<],maxn[MAX_N<<];
PII b[MAX_N];
int a[MAX_N],next[MAX_N],n;
set<int> Set; void push_down(int idx,int l,int r){
if( delta[idx]!=- ){
int m = l+r>>;
sum[idx<<] = (m-l+)*delta[idx];
sum[idx<<|] = (r-m)*delta[idx];
delta[idx<<] = delta[idx<<|] = maxn[idx<<] = maxn[idx<<|] = delta[idx];
delta[idx] = -;
}
} void push_up(int idx){
sum[idx] = sum[idx<<]+sum[idx<<|];
maxn[idx] = max(maxn[idx<<],maxn[idx<<|]);
} void update(int L,int R,LL x,int idx,int l,int r){
if( R<l||L>r ) return;
if( L<=l&&R>=r ) {
sum[idx] = (r-l+)*x;
maxn[idx] = delta[idx] = x;
return;
}
push_down(idx,l,r);
int m = l+r>>;
if( L<=m ) update(L,R,x,idx<<,l,m);
if( R>m ) update(L,R,x,idx<<|,m+,r);
push_up(idx);
} int query(LL x,int idx,int l,int r){
if( maxn[idx]<=x ) return r+;
if( l==r ) return l;
push_down(idx,l,r);
int m = l+r>>;
if( maxn[idx<<]>x ) return query(x,idx<<,l,m);
else return query(x,idx<<|,m+,r);
} LL querySum(int L,int R,int idx,int l,int r){
if( L<=l&&R>=r ) return sum[idx];
push_down(idx,l,r);
int m = l+r >> ;
LL res = ;
if( L<=m ) res = querySum(L,R,idx<<,l,m);
if( R>m ) res += querySum(L,R,idx<<|,m+,r);
return res;
} int main(){
while(scanf("%d",&n)!=EOF&&n){
memset(sum,,sizeof(sum));
memset(delta,-,sizeof(delta));
Set.clear();
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i] = PII(a[i],i);
next[i] = n+;
}
sort(b+,b++n);
b[n+].first = b[n].first; b[n+].second = n+;
for(int i=;i<=n;i++){
if( b[i].first==b[i+].first ) next[b[i].second] = b[i+].second;
}
int mmex = ;
for(int i=;i<=n;i++){
Set.insert(a[i]);
while( Set.find(mmex)!=Set.end() ) mmex++;
update(i,i,mmex,,,n);
}
LL ans = sum[];
for (int l = ; l <= n; l++) {
update(l,l,,,,n);
int p = query(a[l],,,n);
p = max(l+,p);
int q = next[l] - ;
update(p,q,a[l],,,n);
ans += sum[];
}
printf("%I64d\n", ans);
}
return ;
}
[HDU 4747] Mex (线段树)的更多相关文章
- hdu 4747 mex 线段树+思维
http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...
- hdu 4747 Mex( 线段树? 不,区间处理就行(dp?))
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 4747 Mex ( 线段树好题 + 思路 )
参考:http://www.cnblogs.com/oyking/p/3323306.html 相当不错的思路,膜拜之~ 个人理解改日补充. #include <cstdio> #incl ...
- hdu 4747【线段树-成段更新】.cpp
题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 4747 Mex 递推/线段树
题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)
Problem Description Mex is a function on a set of integers, which is universally used for impartial ...
随机推荐
- Hive(六):HQL DDL
HQL语法基于 SqlLine(http://sqlline.sourceforge.net/),DDL主要包含数据库.函数.视图的创建.修改.删除,参考资料:(https://cwiki.apach ...
- HDP2.4安装(一):Centos7安装
在进入大数据领域来,一直使用微软的Azure HDInsight,当前在中国区仅支持在Windows系统上部署集群,虽然创建的过程很简单,但对于开发人员来说,就是一个黑盒子,在更深入的研究和开发扩展的 ...
- javascript 容错
window.onerror=function(){ return true;} 系统有onerror报错的代码,只要重新一下就可以在javascript错误的时候返回真(true)
- gcc内嵌汇编详解
[作者:byeyear 首发:cnblogs Email:east3@163.com 转载请注明] 有时候我们希望在C/C++代码中使用嵌入式汇编,因为C中没有对应的函数或语法可用. ...
- Func系列1:安装配置
简介 Func是由红帽子公司以Fedora平台构建的统一网络控制器,是为解决集群管理.监控问题而设计开发的系统管理框架.它是一个能有效简化多服务多服务器系统管理工作的工具,它易于学习.使用和扩展,功能 ...
- freeswitch编译
编译1.6版本的话,debian的包就太老,需要添加新源 echo "deb http://files.freeswitch.org/repo/deb/debian/ jessie main ...
- makefile中的shell语法
在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是 ...
- netty常用代码
一. Server public class TimeServer_argu { public void bind(int port) throws InterruptedException { Ev ...
- .net关于httpModules的应用示例
这三个对象我们在开发Asp.net程序时经常会用到,似乎很熟悉,但有时 候又不太确定.本文通过一个简单的例子来直观的比较一下这三个对象的使用. HttpModule:Http模块,可以在页面处理前后. ...
- NeHe OpenGL教程 第八课:混合
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...