题意 (Codeforces 548D)

对一个有$n$个数的数列,我们要求其连续$x(1\le x\le n)$(对于每个$x$,这样的连续group有若干个)的最小数的最大值。

分析

这是一道用了单调栈的题目,用的贼好。算是第一次应用吧。
我们定义$l_i$为左侧比第$i$个数小的数的下标的最大值(没有就是0);$r_i$就是右侧比第$i$个数小的数的下标的最小值(没有就是$n+1$)。这样定义完后,我们会发现,$a_i$是$[a_{l_i+1},a_{r_i-1}]$的最小值,也就是size为$1,2,...,r_i-l_i-1$的最小值。这是可以线性地实现的,利用单调栈。具体实现见代码。
接下来就要更新答案。粗一看好像只有$O(n^2)$的更新方法。但是同样有线性的更新方法。维护一个$ans$数组,里面放了长度为$i$的时候的最大值。那么初始时,对每个$ans_i$作赋值(利用前面的两个数组并取最大值——要用最大值嘛)。接下来就是线性的骚操作:我们知道$ans_i$是$1,2,...,i$的最小值,那么倒过来逐对比较更新就可以了。
这样一来,就能用$O(3n)$的算法解决。

代码

  1. #include <bits/stdc++.h>
  2. #define MP make_pair
  3. #define PB push_back
  4. #define fi first
  5. #define se second
  6. #define ZERO(x) memset((x), 0, sizeof(x))
  7. #define ALL(x) (x).begin(),(x).end()
  8. #define rep(i, a, b) for (int i = (a); i <= (b); ++i)
  9. #define per(i, a, b) for (int i = (a); i >= (b); --i)
  10. #define QUICKIO \
  11. ios::sync_with_stdio(false); \
  12. cin.tie(0); \
  13. cout.tie(0);
  14. using namespace std;
  15. using ll = long long;
  16. using ull = unsigned long long;
  17. using pi = pair<int,int>;
  18. const int MAXN=200000;
  19. // After reading the editorial.
  20. int main()
  21. {
  22. QUICKIO
  23. int n,arr[MAXN+5];
  24. cin>>n; rep(i,1,n) cin>>arr[i];
  25. int l[MAXN+5],r[MAXN+5];
  26. stack<int> s;
  27. rep(i,1,n)
  28. {
  29. while(!s.empty() && arr[s.top()]>=arr[i])
  30. s.pop();
  31. if(s.empty())
  32. l[i]=0;
  33. else
  34. l[i]=s.top();
  35. s.push(i);
  36. }
  37. s=stack<int>();
  38. per(i,n,1)
  39. {
  40. while(!s.empty() && arr[s.top()]>=arr[i])
  41. s.pop();
  42. if(s.empty())
  43. r[i]=n+1;
  44. else
  45. r[i]=s.top();
  46. s.push(i);
  47. }
  48. int ans[MAXN+5]; memset(ans,-1,sizeof(ans));
  49. rep(i,1,n)
  50. {
  51. int len=r[i]-l[i]-1;
  52. ans[len]=max(ans[len],arr[i]);
  53. }
  54. per(i,n-1,1) ans[i]=max(ans[i],ans[i+1]);
  55. rep(i,1,n)
  56. {
  57. cout<<ans[i];
  58. if(i==n)cout<<endl;
  59. else cout<<" ";
  60. }
  61. return 0;
  62. }

引申

单调栈还有些类似的题目:HDU 1506、HDU 5033、POJ 2796、POJ 3250。
类似的还有单调队列。
题解将会之后补上。

「日常训练」Mike and Feet(Codeforces Round #305 Div. 2 D)的更多相关文章

  1. 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)

    题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...

  2. 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)

    题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...

  3. 「日常训练」More Cowbell(Codeforces Round #334 Div.2 B)

    题意与分析(CodeForces 604B) 题意是这样的:\(n\)个数字,\(k\)个盒子,把\(n\)个数放入\(k\)个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少(水题) 不 ...

  4. 「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)

    题意与分析(CodeForces 540C) 这题坑惨了我....我和一道经典的bfs题混淆了,这题比那题简单. 那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落.然后求可行解. 但是 ...

  5. 「日常训练」School Marks(Codeforces Round 301 Div.2 B)

    题意与分析(CodeForces 540B) 题意大概是这样的,有一个考试鬼才能够随心所欲的控制自己的考试分数,但是有两个限制,第一总分不能超过一个数,不然就会被班里学生群嘲:第二分数的中位数(科目数 ...

  6. 「日常训练」The Intriguing Obsession(CodeForces Round #439 Div.2 C)

    2018年11月30日更新,补充了一些思考. 题意(CodeForces 869C) 三堆点,每堆一种颜色:连接的要求是同色不能相邻或距离必须至少3.问对整个图有几种连接方法,对一个数取模. 解析 要 ...

  7. 「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)

    题意与分析 图论基础+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #defi ...

  8. 「日常训练」Two Substrings(Codeforces Round 306 Div.2 A)

    题意与分析 一道非常坑的水题.分析醒了补. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back ...

  9. 「专题训练」Hard problem(Codeforces Round #367 Div. 2 C)

    题意与分析 题意:给出\(n\)个字符串,可以反转任意串,反转每个串都有其对应的花费\(c_i\).经过操作后是否能满足字符串\(\forall i \in [1,n] \text{且} i \in ...

随机推荐

  1. POJ 1632 Vase collection【状态压缩+搜索】

    题目传送门:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS   Memory Limit: 10000K Total ...

  2. POJ 1579 Function Run Fun 【记忆化搜索入门】

    题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Tota ...

  3. 【转】深度分析Java的ClassLoader机制(源码级别)

    原链接 Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中, JVM在加载类的时候,都是通过ClassLoa ...

  4. mybatis学习记录二——mybatis开发dao的方法

    4.1     SqlSession使用范围 4.1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...

  5. 了解Mysql与MariaDb的关系

    MariaDB是MySQL源代码的一个分支,随着Oracle买下Sun,MySQL也落入了关系型数据库王者之手.在意识到Oracle会对MySQL许可做什么后便分离了出来(MySQL先后被Sun.Or ...

  6. HDU 1312 Red and Black(最简单也是最经典的搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Oth ...

  7. python logging—模块

    python logging模块 python logging提供了标准的日志接口,python logging日志分为5个等级: debug(), info(), warning(), error( ...

  8. c语言描述的静态查找表

    顺序表的查找: 直接循环依次和目标比较就行 有序表的查找(二分查找): int search(SS *T,Type key){ int mid; ; int high=T.length; while( ...

  9. 《深入理解Spring Cloud与微服务构建》书籍目录

    转载请标明出处: https://blog.csdn.net/forezp/article/details/79735542 本文出自方志朋的博客 作者简介 方志朋,毕业于武汉理工大学,CSDN博客专 ...

  10. [oracle]索引与索引表管理

    (一)索引的概念 索引是一种与表或簇相关的数据库对象,能够为数据的查询提供快捷的存取路径,减少磁盘I/O,提高检索效率. 索引由索引值及记录相应物理地址的ROWID两个部分构成,并按照索引值有序排列, ...