[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 ...
随机推荐
- uml类关系
类间的关系:http://www.open-open.com/lib/view/open1328059700311.html 泛化 . 实现 . 关联 . 组合 . 聚合 . 依赖 泛化是继承类,实现 ...
- GitHub简单使用入门
自从google code关闭了下载服务了之后,GitHub作为了目前最好用的免费开源项目托管站点,众多开源项目都托管在github,其中不乏著名的播放器MPC-HC. 不习惯于英文的朋友,难免少不了 ...
- Hive(一):架构及知识体系
Hive是一个基于Hadoop的数据仓库,最初由Facebook提供,使用HQL作为查询接口.HDFS作为存储底层.mapReduce作为执行层,设计目的是让SQL技能良好,但Java技能较弱的分析师 ...
- Jquery中的offset()和position()
今天遇到这个偏移量的问题,特做此记录.以便日后查看. 先看看这两个方法的定义. offset(): 获取匹配元素在当前视口的相对偏移. 返回的对象包含两个整形属性:top 和 left.此方法只对可见 ...
- bzoj2589: Spoj 10707 Count on a tree II
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初 ...
- KindEditor得不到textarea值的解决方法----摘至天涯
以前有朋友遇到过这个问题,就是KindEditor在火狐下或者其他浏览器下都无法得到textarea文本框的值,点击表单提交按钮得到的是空白.昨天天涯PHP博客[http://blog.phpha.c ...
- sql语句延时执行或者是指定时间执行
--使用waitfor语句延迟或暂停程序的执行 --waitfor{delay'time'|time 'time'} delay是指间隔时间 最长到24小时 time是指定时间执行 waitfor d ...
- 使用NSOperation使用,创建线程中传递多个参数
参考:http://blog.csdn.net/dqjyong/article/details/7677557 参考:http://stackoverflow.com/questions/232761 ...
- 我的wordpress插件总结
酷壳(CoolShell.cn)WordPress的插件 注意: 下面的这些插件的链接是其插件主页的链接,你可以在WordPress后台管理中添加插件时直接搜索安装就可以了. 插件不是越多越好.WP的 ...
- iphone dev 入门实例2:Pass Data Between View Controllers using segue
Assigning View Controller Class In the first tutorial, we simply create a view controller that serve ...