参考:http://www.cnblogs.com/oyking/p/3323306.html

相当不错的思路,膜拜之~

个人理解改日补充。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <algorithm>
  5.  
  6. #define lson l, m, rt << 1
  7. #define rson m + 1, r, rt << 1 | 1
  8. #define lc rt << 1
  9. #define rc rt << 1 | 1
  10. #define LL long long int
  11.  
  12. using namespace std;
  13.  
  14. const int MAXN = ;
  15.  
  16. struct node
  17. {
  18. int pos;
  19. int next;
  20. };
  21.  
  22. LL sum[ MAXN << ];
  23. int maxi[ MAXN << ];
  24. int mini[ MAXN << ];
  25. int N;
  26. int num[MAXN];
  27. node D[ MAXN << ];
  28. int head[MAXN];
  29. int EdgeN;
  30.  
  31. void AddEdge( int u, int v )
  32. {
  33. D[EdgeN].pos = v;
  34. D[EdgeN].next = head[u];
  35. head[u] = EdgeN++;
  36. return;
  37. }
  38.  
  39. void PushDown( int rt, int m )
  40. {
  41. if ( maxi[rt] == mini[rt] )
  42. {
  43. maxi[lc] = mini[lc] = maxi[rt];
  44. sum[lc] = (LL)maxi[rt]*( m - ( m >> ) );
  45. maxi[rc] = mini[rc] = mini[rt];
  46. sum[rc] = (LL)maxi[rt]*( m >> );
  47. }
  48. return;
  49. }
  50.  
  51. void PushUp( int rt )
  52. {
  53. sum[rt] = sum[lc] + sum[rc];
  54. maxi[rt] = max( maxi[lc], maxi[rc] );
  55. mini[rt] = min( mini[lc], mini[rc] );
  56. return;
  57. }
  58.  
  59. void build( int l, int r, int rt )
  60. {
  61. if ( l == r )
  62. {
  63. sum[rt] = maxi[rt] = mini[rt] = N - l + ;
  64. return;
  65. }
  66. int m = ( l + r ) >> ;
  67. build( lson );
  68. build( rson );
  69. PushUp( rt );
  70. return;
  71. }
  72.  
  73. void update( int L, int R, int val, int l, int r, int rt )
  74. {
  75. if ( L <= l && r <= R && mini[rt] >= val )
  76. {
  77. sum[rt] = (LL)val*(r - l + );
  78. maxi[rt] = mini[rt] = val;
  79. return;
  80. }
  81. if ( l == r ) return;
  82. PushDown( rt, r - l + );
  83. int m = ( l + r ) >> ;
  84. if ( L <= m && maxi[lc] > val ) update( L, R, val, lson );
  85. if ( R > m && maxi[rc] > val ) update( L, R, val, rson );
  86. PushUp( rt );
  87. return;
  88. }
  89.  
  90. int main()
  91. {
  92. while ( scanf( "%d", &N ) == && N )
  93. {
  94. for ( int i = ; i <= N; ++i )
  95. scanf( "%d", &num[i] );
  96. memset( head, -, sizeof(int)*(N+) );
  97. EdgeN = ;
  98. for ( int i = N; i > ; --i )
  99. {
  100. if ( num[i] <= N )
  101. AddEdge( num[i], i );
  102. }
  103. build( , N, );
  104. LL ans = ;
  105. for ( int i = ; i <= N && sum[]; ++i )
  106. {
  107. int pre = ;
  108. for ( int j = head[i]; j != -; j = D[j].next )
  109. {
  110. update( pre + , D[j].pos, N - D[j].pos + , , N, );
  111. pre = D[j].pos;
  112. //printf("num=%d pos=%d\n", i, D[j].pos );
  113. }
  114. update( pre + , N, , , N, );
  115. ans += sum[];
  116. //printf( "ans=%I64d\n", ans );
  117. }
  118. printf("%I64d\n", ans );
  119. }
  120. return ;
  121. }

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. sql server 基础

    1 .左连接 select a.* ,b.* from student as aleft join hobby as bon a.hobbyid=b.hobbyid 2. 右 连接 select a. ...

  2. python-列表常用功能介绍

    一.列表(list) 1.定义列表 names = [] #定义空列表 names = ['a','b','c'] #定义非空列表 2.访问列表中元素 >>> names = ['a ...

  3. override与重载的区别

    override与重载的区别override 与重载的区别,重载是方法的名称相同.参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写.

  4. C++编程经验总结1

    面向对象的精髓: 主函数其实就是对于类的元素和动作的重新组合来进行一项活动. 一个思想概念:程设是清楚的,完美的. 数学是清楚的,是完美的. 物理是有趣的,尤其是量子物理 生物是清楚的,尤其是基因 外 ...

  5. 你们知道SEO每天都在做什么吗?

    医院也有做SEO的,专门负责医院网站优化工作,那么医院的SEO每天都做什么呢?偶然见到一篇文章,转载来分享给大家.感觉写的很实在. 大凡做seo工作的人都知道seo工作者每天都要做大量的外链,像有些个 ...

  6. JavaScript---DOM对象(DHTML)

    1.什么是DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本 ...

  7. mount加载虚拟机增强工具步骤

    1.创建一个挂载目录sudo mkdir /mnt/cdrom 2.在C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso中添加该文件 3 ...

  8. stark组件(7):增加分页功能

    效果图: 分页部分代码: # 1.分页处理 all_count = self.model_class.objects.all().count() query_params = request.GET. ...

  9. 裸机——iNand

    1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...

  10. 在WebAPI中调用其他WebAPI

    client.BaseAddress = new Uri("http://xxx.xxx.xx.xx:xxxx/); client.DefaultRequestHeaders.Accept. ...