Codeforce 319 B. Psychos in a Line 解析(思維、單調棧)

今天我們來看看CF319B

題目連結

題目

給一個數列,如果相鄰兩數,左邊大於右邊,那麼就可以殺死右邊的數字(被殺死的數字在當前一輪也可以殺右邊的數字)

求幾輪以後就沒有數字會自相殘殺了?

前言

第一眼看到就感覺會和單調棧有關,但是實在經驗不足,最後思緒被拉跑到找遞增和遞減數列了...

想法

我們都知道,單調棧最一開始就是拿來找一個元素往左或往右的,第一個比元素本身大或小的元素。

但這題還需要我們利用單調棧運行時的過程。

首先我們從數列左邊開始處理(跑單調棧找往左看第一個比自身大的),並且將第\(i\)個元素在第幾輪會被殺掉儲存為\(pre[i]\),接著注意到這件事(令第\(i\)元素往左看第一個大於的元素的index為\(j\)):\(pre[i]=\min\{i-j,[j+1,i]區段中最大的pre[.]+1\}\),其中\(i-j\)代表最慢的情況就是由左邊第一大的元素慢慢殺過來,而後者代表\([j+1,i]\)這一段都被殺完以後,下一個就是自己被殺。

而重點就在於尋找\([j+1,i]區段中最大的pre[.]\)可以在stack pop的同時計算。其原因是因為:假設目前\([j,i]\)區段已經有一些元素被pop走了,剩下等著還沒pop的元素當然有可能是最大值,要計入考慮,而這些剩下的元素都已經計算過\(pre[i']=\min\{i'-j',[j'+1,i']區段中最大的pre[.]+1\}\),又,\(i'-j'\ge[j'+1,i']區段中最大的pre[.]+1\)。所以只要計算還在stack中的最大值,就等於整個\([j+1,i]\)區間的最大值了。

最後只要輸出\(pre[.]\)中的最大值就好。

程式碼:

const int _n=1e5+10;
int t,n,a[_n];
int pre[_n];
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;rep(i,0,n)cin>>a[i];
stack<int> s;rep(i,0,n){
while(!s.empty() and a[s.top()]<a[i]){
pre[i]=max(pre[i],pre[s.top()]);s.pop();
}
pre[i]=min(s.empty()?0:i-s.top(),pre[i]+1);
s.push(i);
}int maxx=-1e9;rep(i,0,n)maxx=max(maxx,pre[i]);
cout<<maxx<<'\n';
return 0;
}

標頭、模板請點Submission看

Submission

B. Psychos in a Line 解析(思維、單調棧)的更多相关文章

  1. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  2. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  3. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  4. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  5. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  6. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

  7. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  8. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

  9. B. Kay and Snowflake 解析(思維、DFS、DP、重心)

    Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...

随机推荐

  1. 关于windows服务器wsus客户端配置的修改

    本文环境如下: 服务器:Windows Server 2012 R2 Standard 由于公司服务器是加了域环境的,又需要将wsus客户端指向另一台wsus服务器,修改本地组策略.可能会被域控给修改 ...

  2. python3-day3

    一.函数基本语法及特性 重复用到的代码通过def封装起来,用到的时候直接调用函数名字:语法 1 def 函数名字(内容): 2 需要执行的动作 什么是函数: 函数一词来源于数学,但编程中的「函数」概念 ...

  3. Redis小记(二)

    1.redis数据库 redis数据库属于内存数据库,若不将数据存到磁盘中,服务器进程退出,数据也会消失 redis所有数据库都保存在redisServer结构的db数组中,db数组的每一项都是一个r ...

  4. Hibernate4.3 QBC查询

    一.基本查询 1 Session session = HibernateUtils.getSession(); 2 //创建QBC查询接口的实现类 3 Criteria criteria = sess ...

  5. 普利姆算法(prim)

    普利姆算法(prim)求最小生成树(MST)过程详解 (原网址) 1 2 3 4 5 6 7 分步阅读 生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程 ...

  6. Linux下彻底删除安装的rpm包

    如何彻底Linux系统下安装的rpm包?现以mySQL为例进行介绍: 一.使用以下命令查看mysql安装情况 [root@xpq mysql]# rpm -qa|grep -i mysql MySQL ...

  7. matlab中卷积convolution与filter用法

    转自:https://blog.csdn.net/dkcgx/article/details/46652021 转自:https://blog.csdn.net/Reborn_Lee/article/ ...

  8. 【题解】[APIO2010]特别行动队

    Link 题目大意:一段区间的贡献是\(ax^2+bx+c,x=\sum v\),求一个划分让总区间的价值最大.分段必须连续. \(\text{Solution:}\) 设计\(dp[i]\)表示前\ ...

  9. MySQL 8 新特性之Clone Plugin

    Clone Plugin是MySQL 8.0.17引入的一个重大特性,为什么要实现这个特性呢?个人感觉,主要还是为Group Replication服务.在Group Replication中,添加一 ...

  10. Prometheus入门教程(二):Prometheus + Grafana实现可视化、告警

    文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/56S290p4j9KROB5uGRcGkQ Prometheus UI 提供了快速验证 PromQL ...