参考: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. Linux 启动、停止、重启tomcat工具(Shell脚本)

    1.   启动 #!/bin/bash pids=`ps -ef | grep java | grep -w tomcat | awk '{print $2}'` #pids=`ps -ef | gr ...

  2. CUDA中多维数组以及多维纹理内存的使用

    纹理存储器(texture memory)是一种只读存储器,由GPU用于纹理渲染的图形专用单元发展而来,因此也提供了一些特殊功能.纹理存储器中的数据位于显存,但可以通过纹理缓存加速读取.在纹理存储器中 ...

  3. Android笔记(预安装APK)

    一般一个安卓的产品在出厂时,会预安装许多APK,关于这些APP,主要分为下面这几类 1.系统级别APK 这一类应用一般是:电话/设置或者厂家自己特定的应用. 2.系统预安装APK 因为商业原因,产品出 ...

  4. 关于Vue 兄弟组件通信

    最近项目中遇到希望在操作路由组件里面内容的时候可以影响共用组件Header组件(这个其实就是他的兄弟组件)的操作.  意思就是 router-view指向的router来影响Header组件的信息 首 ...

  5. 牛客小白月赛1 I あなたの蛙が帰っています 【卡特兰数】

    链接:https://www.nowcoder.com/acm/contest/85/I题目描述 あなたの蛙が帰っています!  蛙蛙完成了一趟旅行,回家啦!但它还是没有去它心中非常想去的几个地方.总共 ...

  6. 配置intellij idea中的欢迎页而不使用默认的index.jsp

    在web.xml中添加 <welcome-file-list> <welcome-file>abc.jsp</welcome-file> </welcome- ...

  7. python数据类型的转换

  8. Java web--过滤器

    本文引自:https://www.cnblogs.com/dudududu/p/8505177.html 参考博客:http://www.cnblogs.com/coderland/p/5902878 ...

  9. JAVA 扫雷 程序

    文件列表 2.主程序入口 3.1部分源代码 package MineSweeper; import java.awt.BorderLayout; import java.awt.Font; impor ...

  10. C语言进阶——注释符号12

    注释可能大认为非常简单,但是注释其实在C语言中很关键,来看下面一段对话. ---学生: 老师,我觉得注释没有必要深究,因为很简单,对程序功能也没有影响. ---老师: 注释是C语言最重要的工具,我们先 ...