参考:http://www.cnblogs.com/oyking/p/3323306.html

相当不错的思路,膜拜之~

个人理解改日补充。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lc rt << 1
#define rc rt << 1 | 1
#define LL long long int using namespace std; const int MAXN = ; struct node
{
int pos;
int next;
}; LL sum[ MAXN << ];
int maxi[ MAXN << ];
int mini[ MAXN << ];
int N;
int num[MAXN];
node D[ MAXN << ];
int head[MAXN];
int EdgeN; void AddEdge( int u, int v )
{
D[EdgeN].pos = v;
D[EdgeN].next = head[u];
head[u] = EdgeN++;
return;
} void PushDown( int rt, int m )
{
if ( maxi[rt] == mini[rt] )
{
maxi[lc] = mini[lc] = maxi[rt];
sum[lc] = (LL)maxi[rt]*( m - ( m >> ) );
maxi[rc] = mini[rc] = mini[rt];
sum[rc] = (LL)maxi[rt]*( m >> );
}
return;
} void PushUp( int rt )
{
sum[rt] = sum[lc] + sum[rc];
maxi[rt] = max( maxi[lc], maxi[rc] );
mini[rt] = min( mini[lc], mini[rc] );
return;
} void build( int l, int r, int rt )
{
if ( l == r )
{
sum[rt] = maxi[rt] = mini[rt] = N - l + ;
return;
}
int m = ( l + r ) >> ;
build( lson );
build( rson );
PushUp( rt );
return;
} void update( int L, int R, int val, int l, int r, int rt )
{
if ( L <= l && r <= R && mini[rt] >= val )
{
sum[rt] = (LL)val*(r - l + );
maxi[rt] = mini[rt] = val;
return;
}
if ( l == r ) return;
PushDown( rt, r - l + );
int m = ( l + r ) >> ;
if ( L <= m && maxi[lc] > val ) update( L, R, val, lson );
if ( R > m && maxi[rc] > val ) update( L, R, val, rson );
PushUp( rt );
return;
} int main()
{
while ( scanf( "%d", &N ) == && N )
{
for ( int i = ; i <= N; ++i )
scanf( "%d", &num[i] );
memset( head, -, sizeof(int)*(N+) );
EdgeN = ;
for ( int i = N; i > ; --i )
{
if ( num[i] <= N )
AddEdge( num[i], i );
}
build( , N, );
LL ans = ;
for ( int i = ; i <= N && sum[]; ++i )
{
int pre = ;
for ( int j = head[i]; j != -; j = D[j].next )
{
update( pre + , D[j].pos, N - D[j].pos + , , N, );
pre = D[j].pos;
//printf("num=%d pos=%d\n", i, D[j].pos );
}
update( pre + , N, , , N, );
ans += sum[];
//printf( "ans=%I64d\n", ans );
}
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【线段树-成段更新】.cpp

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

  4. hdu 1754 I Hate It(线段树水题)

    >>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...

  5. HDU 1698 Just a Hook (线段树模板题-区间求和)

    Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...

  6. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  7. hdu 3016 dp+线段树

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

  8. hdu-1540线段树刷题

    title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...

  9. hdu-5023线段树刷题

    title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...

随机推荐

  1. C++ Boost库简介

    boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化.不过对比STL,boost更加实用.STL集中在算法部分,而boost包含了不少工具类, ...

  2. 循环语句:LOOP,WHILE和数字式循环

    一 简单循环 1 语法: LOOP      要执行的语句;      EXIT WHEN <条件语句> --条件满足,退出循环语句  END LOOP; 2 例子: DECLARE    ...

  3. 关于ACL中通配符掩码(反掩码)认识

    ACL(Access Control List)  访问控制列表在作为数据包的过滤器以及在对指定的某种类型的数据包的优先级,起到了对某些数据包的优先级起到了限制流量的作用,减少了网络的拥塞.      ...

  4. cocos2dx 修改亮度、对比度、色调、饱和度

    废话少说,直接修改CCSprite使用的片面着色器ccShader_PositionTextureColor_noMVP.frag: /* * cocos2d for iPhone: http://w ...

  5. MFC项目依赖 BCG框架示例

    1.创建一个简单的MFC工程: 2.将BCG框架项目导入到新建的mfc解决方案中,例如将BCGCBPro\BCGCBPRO140.vcxproj添加到解决方案. 3.修改mfc项目属性,包含BCG框架 ...

  6. Webpack4 学习笔记一初探Webpack

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 打包文件 支持JS模块化 模式: production(0配置默认), development(生产环境) 更详细的 ...

  7. LeetCode297. Serialize and Deserialize Binary Tree

    题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实 ...

  8. >题解< 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米.我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置:数轴上的每个整数点,即 0,1 ...

  9. redis 面试题

    https://www.cnblogs.com/ftl1012/p/redisExam.html 1. 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashM ...

  10. scrapy--json(喜马拉雅Fm)(二)

    学习了对数据的储存,感觉还不够深入,昨天开始对储存数据进行提取.整合和图像化显示.实例还是喜马拉雅Fm,算是对之前数据爬取之后的补充. 明确需要解决的问题 1,蕊希电台全部作品的进行储存 --scra ...