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-线段树 概述 这道题和上次做的那道染色问题一样, ...
随机推荐
- sql server 基础
1 .左连接 select a.* ,b.* from student as aleft join hobby as bon a.hobbyid=b.hobbyid 2. 右 连接 select a. ...
- python-列表常用功能介绍
一.列表(list) 1.定义列表 names = [] #定义空列表 names = ['a','b','c'] #定义非空列表 2.访问列表中元素 >>> names = ['a ...
- override与重载的区别
override与重载的区别override 与重载的区别,重载是方法的名称相同.参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写.
- C++编程经验总结1
面向对象的精髓: 主函数其实就是对于类的元素和动作的重新组合来进行一项活动. 一个思想概念:程设是清楚的,完美的. 数学是清楚的,是完美的. 物理是有趣的,尤其是量子物理 生物是清楚的,尤其是基因 外 ...
- 你们知道SEO每天都在做什么吗?
医院也有做SEO的,专门负责医院网站优化工作,那么医院的SEO每天都做什么呢?偶然见到一篇文章,转载来分享给大家.感觉写的很实在. 大凡做seo工作的人都知道seo工作者每天都要做大量的外链,像有些个 ...
- JavaScript---DOM对象(DHTML)
1.什么是DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本 ...
- mount加载虚拟机增强工具步骤
1.创建一个挂载目录sudo mkdir /mnt/cdrom 2.在C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso中添加该文件 3 ...
- stark组件(7):增加分页功能
效果图: 分页部分代码: # 1.分页处理 all_count = self.model_class.objects.all().count() query_params = request.GET. ...
- 裸机——iNand
1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...
- 在WebAPI中调用其他WebAPI
client.BaseAddress = new Uri("http://xxx.xxx.xx.xx:xxxx/); client.DefaultRequestHeaders.Accept. ...