t老师的做法好神……

题目描述

桌面上有 n 个水果,分别是苹果和橘子。Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量。求最长的区间大小。

输入格式

第一行一个整数 n($1 \le n \le 100000$),表示水果个数。 接下来一行共有 n 个字符$a_1, a_2, ..., a_n (a_i \in \{j,p\})$,分别表示苹果和橘子(波兰语)。

输出格式

输出一行共一个数字,表示最长的区间大小。

样例输入

6
jpjppj

样例输出

4

数据范围与提示

对于 $20\%$ 的数据,$n \le 1000$.
对于 $50\%$ 的数据,$n \le 10000$.
对于所有数据,$1 \le n \le 100000$.


题目分析

做法来源:「LOJ #2430」「POI2014」沙拉餐厅 Salad Baralad Bar

令$d_i$为$\sum_{x=1}^{i}\{[s_x=='p']-[s_x=='j']\}$,那么合法区间的充要条件就是$i \in (l,r), d_l \le d_i \le d_r$。(这个转化超级妙的)

那么用单调栈找到离以$i$为右端点区间的最近$l$,满足$d_l>d_i$,于是左端点就是$[l+1,r]$间$d_i$最小值的位置。

所以在单调栈过程中顺带维护以$i$为起点区间最小值的位置。有个小细节就是利用$f[0]=0$这么一个初值,来做相当于哨兵节点一样的作用,避免了$d_i<0$被判断合法。

感觉我单调栈并不熟练……

 1 #include<bits/stdc++.h>
 2 const int maxn = 1000035;
 3
 4 int n,ans,cnt,top,stk[maxn],d[maxn],f[maxn];
 5 char s[maxn];
 6
 7 int main()
 8 {
 9     scanf("%d%s",&n,s+1);
10     for (int i=1; i<=n; i++)
11     {
12         d[i] = d[i-1]+(s[i]=='p'?1:-1);
13         while (top&&stk[top] <= d[i])
14         {
15             if (d[f[top-1]] > d[f[top]]) f[top-1] = f[top];
16             top--;
17         }
18         if (d[f[top]] <= d[i]) ans = std::max(ans, i-f[top]);
19         stk[++top] = d[i], f[top] = i;
20     }
21     printf("%d\n",ans);
22     return 0;
23 }

END

转载于:https://www.cnblogs.com/antiquality/p/9838566.html

【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar相关推荐

  1. 【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar

    题解 波兰人的j是苹果,p是橘子 还真是跟中国过不去啊= =写的时候很难受 我们先求出每个点作为起点,能延伸到的最大长度,这个可以处理成前缀和,查询一下区间最小值是不是小于0,用st表实现,如果区间最 ...

  2. 【思维题 细节】loj#6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相

    挂于±1的细节-- 题目描述 跳蚤王国爆发了一场动乱,国王在镇压动乱的同时,需要在跳蚤国地方钦定一个人来做宰相. 由于当时形势的复杂性,很多跳蚤都并不想去做一个傀儡宰相,带着宰相的帽子,最后还冒着被打 ...

  3. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  4. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  5. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  6. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

  7. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  8. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  9. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

最新文章

  1. 黄忠---忠心不二主
  2. 2021-06-05
  3. 三十五、Scrapy 中的杂知识总结和代理池的编写
  4. 搜索引擎原理和简单过程【转】
  5. 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)
  6. 链家信息python
  7. 【kafka】Kafka coordinator coordinator 原理剖析
  8. lamp php的ssl,ssh支持
  9. 说说命令提示符:tcping命令、tcp协议和ping命令
  10. 微信小程序弹框滑动冒泡,外层页面也被滑动问题
  11. 【科普贴】MDIO接口详解
  12. MATLAB 线性拟合
  13. idea 如何clean工程_IDEA中的clean,清除项目缓存图文教程
  14. 简述银行会计科目的分类
  15. 小白基础知识必备|| 整型常量与进制间的转换
  16. 2021年汽车修理工(中级)考试题库及汽车修理工(中级)实操考试视频
  17. SQL简体繁体转换函数
  18. 背包问题(动态规划 C/C++)
  19. 人力资源书籍排行榜,这些好书不容错过!
  20. 数据分析SQL环比增长率、同比增长率

热门文章

  1. 水中浮力插件buoyancy_程序化河流后续——加入浮力系统
  2. 这枚纸币为什么这么贵?
  3. 未来茅台酒会怎样跌下神坛?
  4. 爷青结是什么意思,爷青回是什么意思,爷青结和爷青回是什么梗
  5. 做生意如何选一个好的行业,请记住这4点
  6. 能搞垮你的不止是同行
  7. 迷茫时,按照这7个方法寻找方向
  8. aws rds监控慢sql_AWS RDS SQL Server入门
  9. ssis 角本组件更新数据_使用SSIS脚本组件作为数据源
  10. 如何使用PowerShell从SQL Server数据创建图表