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

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

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值