题目链接: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. HTML5新事物

    1 指定编码字符集,极力推荐 <meta charset="utf-8"> 2 指定lang,所有的标签上都有,推荐在<html>上指定. 3 css样式的 ...

  2. 从一次异常中浅谈Hibernate的flush机制

    摘自http://www.niwozhi.net/demo_c70_i1482.html http://blog.itpub.net/1586/viewspace-829613/ 这是在一次事务提交时 ...

  3. [Hibernate] - Select/Update/Delete/Insert

    Java bean: package com.my.bean; import java.util.Date; public class WorkPack { private String uWorkP ...

  4. OpenSSL进行SSL通讯的一些问题

    这两个星期真是被OpenSSL给烦透了,几个很简单基本的问题(如果没人告诉你真的很难测出来)把我搞的..哎,有时候真是不知道自己该不该搞技术,发现自己头脑真是蠢得很... 直接上正题. 第一个问题: ...

  5. 深入了解iPad上的MouseEvent【转】

    iPad上没有鼠标,所以手指在触发触摸事件(TouchEvent)的时候,系统也会产生出模拟的鼠标事件(MouseEvent).     这对于普通网页的浏览需求而言,基本可以做到与PC端浏览器无明显 ...

  6. find_in_set mysql

    有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文, type中以 1,3,4的格式存 ...

  7. 71. Simplify Path

    Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...

  8. jstl标签库基础教程及其使用代码

    概述 在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Sta ...

  9. ADF_ADF Faces系列4_ADF数据可视化组件简介之建立BarChart/Gauge/ExportExcel

    2013-05-01 Created By BaoXinjian

  10. socket 发送发送HTTP请求

    socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_S ...