【BZOJ5083】普及 单调栈+二分+RMQ
【BZOJ5083】普及
Description
Input
Output
Sample Input
jpjppj
Sample Output
题解:我们将区间和看成前缀相减和后缀相减,记前缀和为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的更多相关文章
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 题解:https://blog.csdn.net/neither_nor/articl ...
- BZOJ1012最大数 [JSOI2008] 单调栈+二分
正解:单调栈+二分查找(or,线段树? 解题报告: 拿的洛谷的链接quq 今天尝试学习了下单调栈,然后就看到有个博客安利了这个经典例题?于是就去做了,感觉还是帮助了理解趴quqqqqq 这题,首先,一 ...
- 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线
区间计数 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...
- 【bzoj4237】稻草人 分治+单调栈+二分
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)
洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- 【洛谷P1823】音乐会的等待 单调栈+二分
题目大意:给定一个长度为 N 的序列,定义两个数 \(a[i],a[j]\) 相互看得见,意味着 \(\forall k\in [i+1,j-1],a[k]\le a[i],a[k]\le a[j]\ ...
- spoj MINSUB 单调栈+二分
题目链接:点击传送 MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative i ...
随机推荐
- HDU 5186 zhx's submissions (进制转换)
Problem Description As one of the most powerful brushes, zhx submits a lot of code on many oj and mo ...
- Js获取当前时间、日期
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1 ...
- php 检查该数组有重复值
if (count($array) != count(array_unique($array))) { echo '该数组有重复值'; }
- appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行safari
启动appium 命令: appium --address "127.0.0.1" --session-override --pre-launch --debug-log-spac ...
- mysql 导入导出数据库、数据表的方法
mysql 导入导出数据库.数据表的方法. Linux操作系统中,均在控制台下操作.1,导入数据库:前提:数据库和数据表要存在(已经被创建)(1)将数据表 test_user.sql 导入到test ...
- JAVA类加载器概念与线程类加载器
类加载器的功能:通过一个类的全限定名来获取描述此类的二进制字节流的过程 java的类加载器大致可以分为两类,一类是系统提供的,一类是由应用开发人员编写的.系统提供的类加载器有以下三种: 引导类加载器( ...
- Selenium 之18 种定位方式
1 id 定位 driver.find_element_by_id() HTML 规定id 属性在HTML 文档中必须是唯一的.这类似于公民的身份证号,具有很强的唯一性 from selenium i ...
- python-爬图小样
python-爬某页面图 注意:python3+版本与python2有一定区别,需要注意多点. #! /usr/bin/env python3.5.4 # coding=utf-8 # 爬百度某贴吧页 ...
- js基本知识2
一.提示框 1. 弹出警示框 alert(); window.alert(); window 窗口 2. 控制台输出 console.log() 3. 文档打印 document 文档 documen ...
- Java callback
Java中的回调(callback)是很重要的一个概念,spring整合hibernate大量使用了这种技术. 究竟怎样才是回调呢? 这是网上最多见到的说明: 1.class A,clas ...