题目链接: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 (线段树)的更多相关文章

  1. hdu 4747 mex 线段树+思维

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

  2. hdu 4747 Mex( 线段树? 不,区间处理就行(dp?))

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. HDU 4747 Mex ( 线段树好题 + 思路 )

    参考:http://www.cnblogs.com/oyking/p/3323306.html 相当不错的思路,膜拜之~ 个人理解改日补充. #include <cstdio> #incl ...

  4. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

  5. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  6. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  7. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. HDU 4747 Mex 递推/线段树

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...

  9. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  10. 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 ...

随机推荐

  1. python file operation

    file.open(name[,mode[,buffering]]) 模式的类型有: r 默认只读 w     以写方式打开,如果文件不存在则会先创建,如果文件存在则先把文件内容清空(truncate ...

  2. 数据接口管理工具 thx RAP

    RAP是数据接口管理工具.在开发时前端将请求转至RAP,由RAP提供模拟数据:而后端使用RAP测试接口的正确性.这样RAP就成为了开发过程中的强 依赖,进而确保接口文档的实时正确性.RAP采用JSON ...

  3. 转载:mybatis自动生成

    MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://generator.sturgeon.mopaas.com/ 该中文文档由于尽可能和原文内容 ...

  4. 【linux】find命令详解

    find命令格式:find [搜索范围][匹配条件] -name 参数:按照名字查找 [root@andon ~]# find /root -name test ###精确查找 /root/test ...

  5. Spring实战2:装配bean—依赖注入的本质

    主要内容 Spring的配置方法概览 自动装配bean 基于Java配置文件装配bean 控制bean的创建和销毁 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的,这些组件必须 ...

  6. 解决AD域认证问题—“未知的身份验证机制”

    场景: Ad认证登录系统,之前正常.不知服务器调了什么,导致无法登录.提示信息如标题. 解决方案: DirectoryEntry adRoot = new DirectoryEntry("L ...

  7. 正则表达式中的\b

    转自百度知道:https://zhidao.baidu.com/question/58688915.html\b表示的应该是ASCII码中的BS字符(退格字符),匹配字与字中间那个看不见的东西(即一个 ...

  8. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  9. 获取mysql数据表中的列名

    select COLUMN_NAME from information_schema.columns where table_name='table_name' DESCRIBE table_name ...

  10. Python进阶04 函数的参数对应

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经接触过函数(function)的参数(arguments)传递.当时我们根 ...