【BZOJ5083】普及

Description

有一个长度为n的字符串,每一位只会是p或j。你需要取出一个子串S(从左到右或从右到左一个一个取出),使得
不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数。你需要最大化|S|。

Input

第一行一个整数n,接下来一个长度为n的只含有p,j的字符串
N<=10^6

Output

输出S的最大长度

Sample Input

6
jpjppj

Sample Output

4

题解:我们将区间和看成前缀相减和后缀相减,记前缀和为s1[i],后缀和为s2[i],那么区间[l,r]是合法的就等价于s1[r]>=s1[l-1...r-1],s2[l]>=s2[l+1...r+1]。我们可以用单调栈维护每个数左边第一个s1比它大的ls,和右边第一个s2比它大的rs。那么询问就变成了求最大的r-l,满足l>=ls[r]且r<=rs[l]。我们枚举l,然后用RMQ维护区间ls的最小值,然后二分查找即可。

Claris是怎么跑得那么快的啊~

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=1000010;
int n,top,ans;
int ls[maxn],rs[maxn],v[maxn],s1[maxn],s2[maxn],st[maxn],mn[20][maxn],Log[maxn];
char str[maxn];
inline int query(int a,int b)
{
int k=Log[b-a+1];
return min(mn[k][a],mn[k][b-(1<<k)+1]);
}
int main()
{
scanf("%d%s",&n,str+1);
int i,j,l,r,mid;
for(i=1;i<=n;i++) s1[i]=s1[i-1]+(str[i]=='p'?1:-1);
for(i=n;i>=1;i--) s2[i]=s2[i+1]+(str[i]=='p'?1:-1);
for(st[top=1]=0,i=1;i<=n;i++)
{
while(top&&s1[st[top]]<=s1[i]) top--;
mn[0][i]=ls[i]=!top?1:(st[top]+2),st[++top]=i;
}
for(st[top=1]=n+1,i=n;i>=1;i--)
{
while(top&&s2[st[top]]<=s2[i]) top--;
rs[i]=!top?n:(st[top]-2),st[++top]=i;
}
for(i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++) mn[j][i]=min(mn[j-1][i],mn[j-1][i+(1<<(j-1))]);
for(i=1;i<=n;i++)
{
l=i-1,r=rs[i];
while(l<r)
{
mid=(l+r)>>1;
if(query(mid+1,r)<=i) l=mid+1;
else r=mid;
}
ans=max(ans,r-i+1);
}
printf("%d",ans);
return 0;
}

【BZOJ5083】普及 单调栈+二分+RMQ的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 题解:https://blog.csdn.net/neither_nor/articl ...

  3. BZOJ1012最大数 [JSOI2008] 单调栈+二分

    正解:单调栈+二分查找(or,线段树? 解题报告: 拿的洛谷的链接quq 今天尝试学习了下单调栈,然后就看到有个博客安利了这个经典例题?于是就去做了,感觉还是帮助了理解趴quqqqqq 这题,首先,一 ...

  4. 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线

     区间计数   基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80   两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...

  5. 【bzoj4237】稻草人 分治+单调栈+二分

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

  6. 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)

    洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...

  7. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  8. 【洛谷P1823】音乐会的等待 单调栈+二分

    题目大意:给定一个长度为 N 的序列,定义两个数 \(a[i],a[j]\) 相互看得见,意味着 \(\forall k\in [i+1,j-1],a[k]\le a[i],a[k]\le a[j]\ ...

  9. spoj MINSUB 单调栈+二分

    题目链接:点击传送 MINSUB - Largest Submatrix no tags  You are given an matrix M (consisting of nonnegative i ...

随机推荐

  1. 温度测量【RTD】

    原理 温度是表征物体冷热程度的物理量,它可以通过物体随温度变化的某些特性(如电阻.电压变化等特性)来间接测量,通过研究发现,金属铂(Pt) 的阻值跟温度的变化成正比,并且具有很好的重现性和稳定性,利用 ...

  2. Spring Boot 概念知识

    转 http://rapharino.com/coder/Spring-Boot-Induction/ Spring Boot Induction 发表于 2016-10-29   |   分类于 c ...

  3. 揭开Altera公司支持OpenCL的设计工具的神秘面纱

    将程序中处理负荷较大的工作分配给加速器LSI的“异构计算(Heterogeneous Computing)”将踏出崭新的一步.美国Altera公司将于2013年内开始面向普通用户提供可自动由按照异构计 ...

  4. EditText禁止输空格

    1.EditText禁止输空格 editText.setFilters(new InputFilter[]{filter}); private InputFilter filter=new Input ...

  5. 在MAC上安装Oracle JDK

    下载Mac版本的JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html 下载之后,双击dmg文件安装 mac 下查看 ...

  6. UIWebView和UICollectionViewController的使用

    UIWebView和UICollectionViewController的使用 UIWebView UIWebView是iOS内置的浏览器的控件, 可以浏览网页, 打开文档等 .系统自带的Safari ...

  7. jq使用自定义属性实现有title的tab切换

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  8. 利用Python操作Word文档【图片】

    利用Python操作Word文档

  9. 最新PHPcms9.6.0 任意文件上传漏洞

    在用户注册处抓包: 然后发送到repeater POC: siteid=&modelid=&username=z1aaaac121&password=aasaewee311as ...

  10. input 和<fmt:formatDate>的结合使用

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <inpu ...