首页 > 其他分享 >Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]

Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]

时间:2025-01-05 14:32:57浏览次数:1  
标签:Psychos 精神病人 int 题解 左边 Line dp 319B

Psychos in a Line:很好的单调栈优化 dp 题!

观察

我们先观察,一个精神病人会一直杀到什么时候。显然,会杀到右边第一个比他大的精神病人那里,然后他就杀不动了。

因此我们可以从右往左考虑,算出左边的精神病人杀掉这个精神病人后左边的人的答案是什么。假设左边的人目前已经刀了 \(x\) 个人,被杀的人目前会刀 \(y\) 个人。如果左边杀这个人的时候这个人该杀的还没杀完,那么左边人就要接着这个人继续把该杀的杀掉,又因为它们刀人是同步进行的,所以此时左边的人目前刀掉的人数取 \(\max(y,x+1)\)。

于是,我们定义 \(dp_i\) 表示第 \(i\) 个人目前会刀几个人,然后 \(O(n^2)\) 转移即可。

优化

但是这样显然无法通过,考虑如何优化。

因为一个人会被他左边第一个比他大的人杀掉(不一定最后真的是被他杀的,如果他杀这个人之前就被杀了,那么情况还是等价的,不影响计算),所以我们从右到左维护一个单调栈,维护右边的最大值。在一个元素入栈的时候,只取弹出的元素转移即可。

时间复杂度 \(O(n)\),主要还是理解一个人先钦定被左边第一个比他大的人杀,之后再动态调整,不影响最终答案的类似反悔贪心的思想

代码

#include <bits/stdc++.h>
using namespace std;
int n,a[100005],dp[100005],tp=0,s[100005],ans;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=n;i>=1;i--)
    {
        int res=0;
        while(tp&&a[s[tp]]<a[i])res=max(res+1,dp[s[tp--]]);
        s[++tp]=i;
        dp[i]=res;
        ans=max(dp[i],ans);
    }
    cout<<ans;
    return 0;
}

标签:Psychos,精神病人,int,题解,左边,Line,dp,319B
From: https://www.cnblogs.com/zhr0102/p/18653340

相关文章

  • 题解:AT_abc203_e [ABC203E] White Pawn
    由于\(m\le2\times10^{5}\),所以可以把有黑格子的行扔到一个map里面,然后再用一个set存储当前能走到哪些格子。按照题意暴力转移,开两个vectorin和out,分别存储哪些格子要删掉,哪些格子要加入。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;int......
  • [WC2014] 紫荆花之恋 题解
    啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊。因为没有在最开始的时候将所有点设置为已经重构的,所以直接\(R15-R70\)间卡了两三天。似乎也是我第一次大规模使用指针了。这道题假如只有一次询问,就是一道简单淀粉质,直接在根节点建立平衡树,记录\(r_x-dis(x,rt)\),然后找......
  • [CF2053E] Resourceful Caterpillar Sequence 题解
    显然两步之内决胜负。否则两个人会来回拉扯,平局。考虑何时Aron会赢。称与叶子结点边距离小于等于\(1\)的结点为【制胜点】。开局\(q\)在叶子,\(p\)不在叶子,直接赢。方案数\(c(n-c)\),其中\(c\)为叶子数量。\(q\)在一个连着【制胜点】的点,\(p\)不在【制胜点】。Nora......
  • [CF2043D] Problem about GCD 题解
    首先的一个观察是可以把\(G\)除掉,转化成\([\lceil\frac{l}{G}\rceil,\lfloor\frac{r}{G}\rfloor]\)中的两个互质数的差最大值。然后的性质非常神奇。令\(l'\gets\lceil\frac{l}{G}\rceil,r'\gets\lfloor\frac{r}{G}\rfloor\)。若\(r'-l'\)充分大,则一定有一组......
  • P4229 某位歌姬的故事 题解
    题目描述\(T\)组数据,求有多少个长为\(n\)的数组\(h\)满足\(1\leh_i\lea\)和以下\(q\)条限制:\[\max_{l_i\lej\leh_i}h_j=w_i\]对\(998244353\)取模。数据范围\(1\leT\le20\)。\(1\len,a\le9\cdot10^8,1\leq\le500\)。\(1\lel_i\ler_i\len,......
  • P5680 [GZOI2017] 共享单车 题解
    题目传送门前置知识最短路|最近公共祖先|虚树解法题目中所说的回收路线树即以\(k\)为根节点的最短路径树,可以使用Dijkstra构建。标记回收区域本质上是对回收区域构建虚树,然后就和luoguP2495[SDOI2011]消耗战基本一致了,根据儿子节点的投放状态进行树形D......
  • 高频 Python 面试题解析(附代码解释)
    高频Python面试题解析(附代码解释)引言Python作为目前最受欢迎的编程语言之一,广泛应用于Web开发、数据分析、人工智能等领域。在面试中,Python的基础知识、数据结构、算法等方面的高频问题总是被考察。因此,在这篇文章中,我们将深入剖析一些常见的Python面试题,帮助你轻松应对面试挑......
  • P10145 [WC2024] 线段树 题解
    P10145[WC2024]线段树题解\(\mathcalO(4^{n})\)做法对于线段树上的一个节点区间\([l,r)\)我们连无向边\((l,r)\),那么可以用加减表示出一个区间\([L,R)\)等价于\(L,R\)两点联通。于是可以枚举每条边选或不选,用可撤销并查集判断两点是否联通,复杂度\(\mathcalO(2^{2......
  • 【题解】AT agc057A Antichain of Integer Strings
    记\(f(x)\)为最小的大于\(x\)的\(y\),使得\(x\)是\(y\)的子串。易得:\[f(x)=\min(10x,x+10^{|x|})\]其中\(|x|\)表示\(x\)的位数。可以发现,\(f(x)\)为一个严格单调递增的函数。考虑贪心策略,显然选小的数不如选大的数优,因为小的数更有可能成为别的数的子串。于是,我......
  • 网卡丢包问题解决
    1、查看局域网内是否有MAC冲突;2、UDP丢包可以先增大协议栈缓存空间:接收端:echo2129999999>/proc/sys/net/core/rmem_maxecho2129999999>/proc/sys/net/core/rmem_default发送端:echo2129999999>/proc/sys/net/core/wmem_defaultecho2129999999>/proc/sys......