[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 ...
随机推荐
- C#开发BHO程序(引)
一 C#也可以编写BHO程序 因为eve的官方论坛封掉了签名图功能,所以想自己写个BHO插件来“伪造”签名图.研究了几个C++程序,但是始终对响应WebBrowser内的 HTML事件不得其门.这样就 ...
- 利用百度地图API,获取经纬度坐标
利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代 ...
- rails里routes配置文件里的resources和resource的区别
抄自 http://stackoverflow.com/questions/11356146/difference-between-resource-and-resources-in-rails-ro ...
- HDU3415
题目大意: 给出一个有N个数字(-1000..1000,N<=10^5)的环状序列,找出一个长度不大于k的连续子序列,使其和最大. 分析: 我们可以将环状序列从某处切开,变成一行,然后复制前n- ...
- C语言每日一题之No.8
正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个 ...
- sql里将重复行数据合并为一行,数据用逗号分隔
一.定义表变量 DECLARE @T1 table ( UserID int , UserName ), CityName ) ); ,'a','上海') ,'b','北京') ,'c','上海') ...
- System.Data.SqlClient.SqlException.Number的所有错误值列表
在系统数据库(master或msdb或model)的架构(sys)的视图(messages)中: SELECT [message_id] ,[language_id] ,[seve ...
- [linux basic基础]----套接字
套接字是一种通信机制,凭借这种机制client/server系统的开发者既可以在本地机器上进行,也可以跨网络进行. 1,服务器应用程序用系统调用socket来创建一个套接字,他是系统分配给服务器进程的 ...
- mvc 控制器,视图,Razor 语法
mvc 控制器controller:响应用户请求,并修改模型model;输入数据的处理,输出view数据的提供: url入控制器的方法有关联:MVC提供的是方法调用结果: mvc model:是对应用 ...
- (C++) Interview in English. - Constructors/Destructors
Constructors/Destructors. 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成 ...