HDU 4747 Mex ( 线段树好题 + 思路 )
参考: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 ( 线段树好题 + 思路 )的更多相关文章
- 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【线段树-成段更新】.cpp
题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...
- hdu 1754 I Hate It(线段树水题)
>>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...
- 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 ...
- hdu 1754 I Hate It 线段树基础题
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- hdu-5023线段树刷题
title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...
随机推荐
- 【洛谷P3390】矩阵快速幂
矩阵快速幂 题目描述 矩阵乘法: A[n*m]*B[m*k]=C[n*k]; C[i][j]=sum(A[i][1~n]+B[1~n][j]) 为了便于赋值和定义,我们定义一个结构体储存矩阵: str ...
- 安装ubuntu-tweak
第一步:添加tweak源 sudo add-apt-repository ppa:tualatrix/ppa 第二步:更新 sudo apt-get update 第三步:安装ubuntu-t ...
- Adobe Photoshop CS6下载安装
下载链接 http://yunpan.cn/cACgP6Lv5ygit (提取码:f37a) 第一步关键是断开网络,拔掉网线或断开无线 点击登录后,如果没有进入下面的界面,检查是否断网成功 至于选择安 ...
- Knockout 事件传递参数的方法
在Knockout中直接使用函数传递参数是不行的,会导致函数在初始化时就被调用. 要实现参数的传递,有2种方法: 1.方法一:使用函数包裹 <div data-bind="event: ...
- js复习,预编译
注意:函数声明整体提升.变量 声明提升 1.imply global 暗示全局变量:即任何变量,如果变量未声明就赋值,此变量就为全局对象所有 ==> eg: a = 122;==> e ...
- NPM 学习笔记整理
NPM 学习笔记整理 阅读 550,2017年06月04日 发布,来源:blog.ihoey.com 什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ru ...
- tcp服务端socket
import socket if __name__ == '__main__': # 创建tcp服务端socket tcp_server_socket = socket.socket(socket.A ...
- 制作linux系统U盘并使用U盘安装CentOS7.6系统
目录 一.制作linux启动盘 1.1. 准备工作 1.2. 制作linux系统U盘 二.使用U盘安装Centos7.6 2.1. 使用U盘启动 2.2. 更改 ...
- Linux 个人服务搭建脱坑实录
环境:VMware.Centos7 64位.jdk1.7.Tomcat 7 说明:本是个人的爬坑经历所总结出来的,记录一下心得.也给有需要的人提供一些帮助.引用了一些大神的笔记,非常感谢,希望大神们不 ...
- (转)基于REST架构的Web Service设计
原文出处:http://www.williamlong.info/archives/1728.html ------------------------------------------------ ...