参考: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. 机器学习实战之Logistic回归

    Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. ...

  2. caffe中protobuf问题

    安装caffe时,protobuf在使用import caffe时,python版的会提示protobuf的问题,原因是因为protobuf的安装是用python-proto,而在安装anaconda ...

  3. securecrt颜色设置

    https://blog.csdn.net/zq710727244/article/details/53909801

  4. phonegap二维码扫描插件

    原文出处:http://rensanning.iteye.com/blog/2034026 谈谈我使用这个的体会吧; git地址 https://github.com/wildabeast/Barco ...

  5. django+xadmin在线教育平台(九)

    django admin介绍 上一章我们进行了需求分析和数据库设计.本章我们来快速搭建一个可用的后台管理系统. 后台管理系统特点: 权限管理 少前端样式.(样式一般不是很看重), 快速开发 djang ...

  6. 【Effective C++ 读书笔记】导读 Introduction

    学习程序语言根本大法是一回事,学习如何以某种语言设计并实现高效程序则是另一回事. 一组明智选择并精心设计的classes.functions.templates可使程序编写容易.直观.高效.并且远离错 ...

  7. 【Python 2 到 3 系列】 关于除法的余数

    v2.2 以前,除("/")运算符的返回有两种可能情况,分别是整型和浮点型.操作数的不同,是影响计算结果数据类型的关键. 以 a / b 为例,a.b均为整型,则结果返回整型:a. ...

  8. jpeglib的使用

    1. 解压jpeglib tar xvzf libjpeg-turbo-1.2.1.tar.gz 2. 阅读里面的说明文件,得到jpeg解压缩的一般步骤: /*Allocate and initial ...

  9. Urllib库:python内置的http请求库

    1.四个模块: request error parse robotparser 2.urlopen(url, data, timeout) 发送请求 get请求无data: post请求有data 3 ...

  10. POJ:2429-GCD & LCM Inverse(素数判断神题)(Millar-Rabin素性判断和Pollard-rho因子分解)

    原题链接:http://poj.org/problem?id=2429 GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K To ...