BZOJ3521: [Poi2014]Salad Bar
维护p-j的前缀和sum[i],那么一段l~r合法的充要条件是sum[l]<=sum[l~r],sum[r]>=sum[l~r],即中间的所有sum都>=sum[l],<=sum[r]
如果枚举了右端点r,i为r左边第一个i满足sum[i]>sum[r] ,令L=i+1,问题变成找L~r的sum最小值
可以rmq,用并查集离线做rmq可以O(n),具体来说,维护每个位置i~r的rmq,那么1~r到r的rmq一定是若干个不降的段,并查集把每一段并在一起,询问就是问L所在的并查集
code:
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;inline void up(int &x,const int &y){if(x<y)x=y;}
const int maxn = 1100000;int n;
char str[maxn];
int sum[maxn];int fa[maxn];
int findfa(const int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}int t[maxn],tp;
int lt[maxn],lp;int re;int main()
{scanf("%d",&n);scanf("%s",str);t[tp=1]=0,lt[lp=1]=0;for(int i=1;i<=n;i++){fa[i]=i;sum[i]=sum[i-1]+(str[i-1]=='p'?1:-1);while(tp&&sum[t[tp]]>sum[i]) fa[findfa(t[tp--])]=i;t[++tp]=i;while(lp&&sum[lt[lp]]<=sum[i]) lp--;int li=lt[lp]+1; if(li==1) li=0;lt[++lp]=i;up(re,i-findfa(li));}printf("%d\n",re);return 0;
}
BZOJ3521: [Poi2014]Salad Bar相关推荐
- POI2014 Salad Bar
Salad Bar POI2014 题意 1.有一个长度为n的字符串,每一位只会是p或j. 2.找到一个子串S,使得不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数. 3.求 ...
- [POI2014]Salad Bar
题目大意: 一个长度为$n(n\leq10^6)$的字符串,每一位只会是$p$或$j$.你需要取出一个子串$S$(从左到右或从右到左一个一个取出),使得不管是从左往右还是从右往左取,都保证每时每刻已取 ...
- bzoj 3521: [Poi2014]Salad Bar
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3521 POI的题果然都有一些很精妙的O(n)O(n)O(n)做法 带log的比较简单,这里就 ...
- P3564 [POI2014]BAR-Salad Bar(ST表 + 二分)
P3564 [POI2014]BAR-Salad Bar 给定一个长度为nnn的数组,里面元素只有111跟−1-1−1,问选出一个长度为lenlenlen的区间使得,这个区间的前缀和时刻大于零,后缀和 ...
- 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar
t老师的做法好神-- 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...
- 【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar
题解 波兰人的j是苹果,p是橘子 还真是跟中国过不去啊= =写的时候很难受 我们先求出每个点作为起点,能延伸到的最大长度,这个可以处理成前缀和,查询一下区间最小值是不是小于0,用st表实现,如果区间最 ...
- POI2014Salad Bar
POI2014 Salad Bar 这道题的大意就是给你一个字符串,里面只含有p和j,求一个最长的子串,使得从左边开始,p的个数一直比j多,从右边开始也一样. 这道题的话,一开始想歪了,就先对每个字符 ...
- POI 2014 切题记
POI 2014 Salad Bar Description: 有一个长度为nnn的字符串,每一位只会是ppp或jjj.你需要取出一个子串SSS(从左到右或从右到左一个一个取出),使得不管是从左往右还 ...
- 8000 sentences of oral English(four)
第四章 表现感情的短句 (16)高兴时 ●欣喜 How's your newhome? --I'm happy. 我很高兴!我很幸福! I'm ecstatic. 狂喜 I'm thrilled. 我 ...
最新文章
- 如果要存 IP 地址,用什么数据类型比较好?大部人都会答错!
- 写给对 ”游戏开发” 感兴趣的朋友们
- ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
- windows server 2008R2下的mysql主从同步配置
- python学习高级篇(part9)--对象的引用计数
- 大数据是如何基于 Flink 进行实时计算的?
- Androidstudio抽取成员变量快捷键 快捷键大全 自定义setting文件
- python怎么爬取知乎回答并制作词云_爬虫|爬取微博动态
- linux准备环境,组建自己的Linux-01准备环境
- Java 设计模式 Factory Method 工厂方法 模式
- 一个函数中写多少行代码比较合适呢?
- 微软商店下载的python 的 pip 不能修改 config 的解决方法
- 细分领域:偏门的色流玩法+简单的色流变现套路
- java 向量 内积_【vector应用】计算两个向量的内积
- 可能是全网最全的解决无法创建视频捕捉过滤器问题?
- VoIP技术应用中存在的问题的分析研究
- CF632E Thief in a Shop 题解
- 夺命雷公狗—玩转SEO---52---浅谈人工智能在SEO中的应用之机器学习,内链布局篇...
- 防火墙一个系统加固的例子
- 三层架构-UI层 显示数据