HDU 4747 Mex(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747
题意:给出一个数列A。计算所有的mex(i,j)之和。1<=i<=j<=n。
思路:从前向后依次统计以该位置为左端点的区间之和。那么现在我们考虑i计算之后后面的变化。考虑极端情况,若i位置之后的所有数字都大于i,那么i计算之后后面的所有数对的mex值起码为A[i]。那么,我们记录i之后数字A[i]出现的最早位置next[i],每次用A[i]更新[i+1,next[i]-1]这个区间即可。
struct node
{
int L,R,Max,Min,det;
i64 sum;
void set(int x)
{
det=x;
Max=Min=x;
sum=(i64)(R-L+1)*x;
}
};
node a[N<<2];
int d[N],next[N],p[N],b[N];
int n;
void pushUp(int t)
{
if(a[t].L==a[t].R) return;
a[t].sum=a[t*2].sum+a[t*2+1].sum;
a[t].Min=min(a[t*2].Min,a[t*2+1].Min);
a[t].Max=max(a[t*2].Max,a[t*2+1].Max);
}
void pushDown(int t)
{
if(a[t].L==a[t].R) return;
int M=(a[t].L+a[t].R)>>1;
if(a[t].det>0)
{
a[t*2].set(a[t].det);
a[t*2+1].set(a[t].det);
a[t].det=0;
}
}
void build(int t,int L,int R)
{
a[t].L=L;
a[t].R=R;
a[t].det=0;
if(L==R)
{
a[t].Max=a[t].Min=a[t].sum=b[L];
return;
}
int M=(L+R)>>1;
build(t*2,L,M);
build(t*2+1,M+1,R);
pushUp(t);
}
void update(int t,int L,int R,int x)
{
if(L<=a[t].L&&a[t].R<=R&&x<a[t].Min)
{
a[t].set(x);
return;
}
pushDown(t);
int M=(a[t].L+a[t].R)>>1;
if(M>=L&&a[t*2].Max>x) update(t*2,L,R,x);
if(M<R&&a[t*2+1].Max>x) update(t*2+1,L,R,x);
pushUp(t);
}
int main()
{
Rush(n)
{
if(n==0) break;
int i,j=0;
clr(p,0);
FOR1(i,n)
{
RD(d[i]);
if(d[i]>n) d[i]=n+1;
p[d[i]]=1;
while(p[j]) j++;
b[i]=j;
}
for(i=0;i<=n+1;i++) p[i]=n+1;
for(i=n;i>=1;i--)
{
next[i]=p[d[i]];
p[d[i]]=i;
}
build(1,1,n);
i64 ans=a[1].sum;
FOR1(i,n)
{
if(i+1<=next[i]-1) update(1,i+1,next[i]-1,d[i]);
update(1,i,i,0);
ans+=a[1].sum;
}
printf("%I64d\n",ans);
}
}
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 ...
随机推荐
- HDU 2196 求树上所有点能到达的最远距离
其实我不是想做这道题的...只是今天考试考了一道类似的题...然后我挂了... 但是乱搞一下还是有80分....可惜没想到正解啊! 所以今天的考试题是: 巡访 (path.pas/c/cpp) Cha ...
- GameMap地图初始化
init_map(res_path) .初始化mapbase的基本信息 pos2d screen_area = {, }; //普通屏幕大小 m_spBase->init(screen_area ...
- leetcode course shedule
题目就不说了,问题本质就是在一个有向图中查找它是不是存在环. 上网百度了一下,方法是,找出图中入度为0 的点,将以它为起点的边去掉. 重复这一动作,直到所有的边都被去掉(没有环)或者存在边但是无法再去 ...
- 【面试题】Google of Greater China Test for New Grads of 2014总结
2014年Google中国校园招聘采用在线技术笔试,在Code Jam平台上,14号9点到15号9点开放测试题,帮助大家熟悉环境.这个周末也有够忙的,当时就上去看了一下,把输入文件下了一下,今天才把题 ...
- POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)
网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以. 自己做的时候,还没了解过多重背包,该题直接往完全背包思考了.咖啡的钱看作总的背包容量,1.5.10.25分别代表四种物品的重量, ...
- oc和swift的混编
参考:http://blog.sina.com.cn/s/blog_8d1bc23f0102v5tl.html swift中使用oc类的方法 1.创建一个oc.h文件 2.添加需要倒入的oc类的头文件 ...
- POJ 1547
#include<iostream> #include<string> using namespace std; int main() { int length; int hi ...
- hdu 4462(状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4462 思路:由于数据不大,可以直接将所有的状态表示出来,然后枚举,判断能否将方格全部覆盖. http: ...
- 知问前端——创建header区
创建界面 我们首先要设计一个header,这个区域将要设计成永远置顶.也就是,往下拉出滚动条也永远在页面最上层可视区内.在header区,目前先设计LOGO.搜索框.按钮.注册和登录即可. 项目的大致 ...
- 妙味课堂——HTML+CSS(第三课)
常见标签我已经在上一篇文章中提及,我们做前端设计时,主要也是用这些标签(最常用的). 然而有一个问题,就是有的标签都有自己的默认样式.试通过如下代码来说明: <!DOCTYPE html> ...