参考: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. 【洛谷P3390】矩阵快速幂

    矩阵快速幂 题目描述 矩阵乘法: A[n*m]*B[m*k]=C[n*k]; C[i][j]=sum(A[i][1~n]+B[1~n][j]) 为了便于赋值和定义,我们定义一个结构体储存矩阵: str ...

  2. 安装ubuntu-tweak

    第一步:添加tweak源 sudo add-apt-repository ppa:tualatrix/ppa   第二步:更新 sudo apt-get update   第三步:安装ubuntu-t ...

  3. Adobe Photoshop CS6下载安装

    下载链接 http://yunpan.cn/cACgP6Lv5ygit (提取码:f37a) 第一步关键是断开网络,拔掉网线或断开无线 点击登录后,如果没有进入下面的界面,检查是否断网成功 至于选择安 ...

  4. Knockout 事件传递参数的方法

    在Knockout中直接使用函数传递参数是不行的,会导致函数在初始化时就被调用. 要实现参数的传递,有2种方法: 1.方法一:使用函数包裹 <div data-bind="event: ...

  5. js复习,预编译

    注意:函数声明整体提升.变量 声明提升 1.imply global 暗示全局变量:即任何变量,如果变量未声明就赋值,此变量就为全局对象所有 ==>  eg: a = 122;==>  e ...

  6. NPM 学习笔记整理

    NPM 学习笔记整理 阅读 550,2017年06月04日 发布,来源:blog.ihoey.com 什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ru ...

  7. tcp服务端socket

    import socket if __name__ == '__main__': # 创建tcp服务端socket tcp_server_socket = socket.socket(socket.A ...

  8. 制作linux系统U盘并使用U盘安装CentOS7.6系统

    目录   一.制作linux启动盘     1.1. 准备工作     1.2. 制作linux系统U盘   二.使用U盘安装Centos7.6     2.1. 使用U盘启动     2.2. 更改 ...

  9. Linux 个人服务搭建脱坑实录

    环境:VMware.Centos7 64位.jdk1.7.Tomcat 7 说明:本是个人的爬坑经历所总结出来的,记录一下心得.也给有需要的人提供一些帮助.引用了一些大神的笔记,非常感谢,希望大神们不 ...

  10. (转)基于REST架构的Web Service设计

    原文出处:http://www.williamlong.info/archives/1728.html ------------------------------------------------ ...