「日常训练」Mike and Feet(Codeforces Round #305 Div. 2 D)
题意 (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)$的算法解决。
代码
#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO                  \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int,int>;
const int MAXN=200000;
// After reading the editorial.
int main()
{
QUICKIO
    int n,arr[MAXN+5];
    cin>>n; rep(i,1,n) cin>>arr[i];
    int l[MAXN+5],r[MAXN+5];
    stack<int> s;
    rep(i,1,n)
    {
        while(!s.empty() && arr[s.top()]>=arr[i])
            s.pop();
        if(s.empty())
            l[i]=0;
        else
            l[i]=s.top();
        s.push(i);
    }
    s=stack<int>();
    per(i,n,1)
    {
        while(!s.empty() && arr[s.top()]>=arr[i])
            s.pop();
        if(s.empty())
            r[i]=n+1;
        else
            r[i]=s.top();
        s.push(i);
    }
    int ans[MAXN+5]; memset(ans,-1,sizeof(ans));
    rep(i,1,n)
    {
        int len=r[i]-l[i]-1;
        ans[len]=max(ans[len],arr[i]);
    }
    per(i,n-1,1) ans[i]=max(ans[i],ans[i+1]);
    rep(i,1,n)
    {
        cout<<ans[i];
        if(i==n)cout<<endl;
        else cout<<" ";
    }
    return 0;
}
引申
单调栈还有些类似的题目:HDU 1506、HDU 5033、POJ 2796、POJ 3250。 
类似的还有单调队列。 
题解将会之后补上。
「日常训练」Mike and Feet(Codeforces Round #305 Div. 2 D)的更多相关文章
- 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)
		
题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...
 - 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)
		
题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...
 - 「日常训练」More Cowbell(Codeforces Round #334 Div.2 B)
		
题意与分析(CodeForces 604B) 题意是这样的:\(n\)个数字,\(k\)个盒子,把\(n\)个数放入\(k\)个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少(水题) 不 ...
 - 「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)
		
题意与分析(CodeForces 540C) 这题坑惨了我....我和一道经典的bfs题混淆了,这题比那题简单. 那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落.然后求可行解. 但是 ...
 - 「日常训练」School Marks(Codeforces Round 301 Div.2 B)
		
题意与分析(CodeForces 540B) 题意大概是这样的,有一个考试鬼才能够随心所欲的控制自己的考试分数,但是有两个限制,第一总分不能超过一个数,不然就会被班里学生群嘲:第二分数的中位数(科目数 ...
 - 「日常训练」The Intriguing Obsession(CodeForces Round #439 Div.2 C)
		
2018年11月30日更新,补充了一些思考. 题意(CodeForces 869C) 三堆点,每堆一种颜色:连接的要求是同色不能相邻或距离必须至少3.问对整个图有几种连接方法,对一个数取模. 解析 要 ...
 - 「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)
		
题意与分析 图论基础+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #defi ...
 - 「日常训练」Two Substrings(Codeforces Round 306 Div.2 A)
		
题意与分析 一道非常坑的水题.分析醒了补. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back ...
 - 「专题训练」Hard problem(Codeforces Round #367 Div. 2 C)
		
题意与分析 题意:给出\(n\)个字符串,可以反转任意串,反转每个串都有其对应的花费\(c_i\).经过操作后是否能满足字符串\(\forall i \in [1,n] \text{且} i \in ...
 
随机推荐
- 如何解决“请考虑使用 app.config 将程序集“XXXXXXXX”从版本XXXX重新映射到版本XXXX”的问题
			
> 请考虑使用 app.config 将程序集“System.ValueTuple, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”从版本“\ ...
 - 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)
			
洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...
 - HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
			
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1110 Equipment Box Time Limit: 2000/1000 MS (Java/Oth ...
 - Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
			
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616738 本文出自方志朋的博客 RBAC介绍 RBAC(Role-Based Acce ...
 - 自动诊断档案库(ADR)学习
			
(1)ADR概述 Oracle 11g的FDI(Fault Diagnosability Infrastructure)是自动化诊断方面的一个增强,其核心组件为自动诊断库(Automatic Diag ...
 - oracle删除一个表内的重复数据,
			
查询以及删除一个数据库表内的重复数据. 1.查询表中的多余的重复记录,重复记录是根据单个字段来判断的. select * from biao where id in (select id from b ...
 - Data Guard 知识 (来自网络)
			
更改DG工作模式前提参数得设定合理. Physical standby直接从主库接受archived log,然后直接做基于block的物理恢复(更新或调整变化的block),所以physical s ...
 - oracle中特殊字符替换
			
replace语法: REPLACE(char,search_string,[replacement_string]) 在replace中,每个search_String 都会被replacement ...
 - Flask—06-理解掌握flask数据模型(02)
			
数据模型 模型关系 一对多(使用最多) 一:学生(Student) 需要添加反向引用 多:文章(Article) 需要添加外键关联 一对一 一:学生(Student),主表 需要添加反向引用,在一对多 ...
 - iOS 通用缓存:HanekeSwift
			
iOS 通用缓存:HanekeSwift Haneke 是个采用 Swift 编写的轻量级 iOS 通用缓存.示例: 初始化一个数据缓存: let cache = Cache<NSData> ...