【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar
题解
波兰人的j是苹果,p是橘子
还真是跟中国过不去啊= =写的时候很难受
我们先求出每个点作为起点,能延伸到的最大长度,这个可以处理成前缀和,查询一下区间最小值是不是小于0,用st表实现,如果区间最小值大于等于0,那么这段区间,以该点作为起点是合法的
然后求出每个点作为终点能延伸到的最大长度,处理成后缀和
然后枚举每个点作为起点,找出能延伸的最长右端点,然后再次二分答案,如果二分到的是mid,且mid到ri[i]中的最小值小于等于该点,那么右端点一定可以再往右,否则往左
三次二分答案,三次st表,比较神奇。。。
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <cmath>
#include <bitset>
#include <queue>
#define enter putchar('\n')
#define space putchar(' ')
//#define ivorysi
#define pb push_back
#define mo 974711
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define MAXN 100005
#define eps 1e-12
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int N,sum[MAXN],st[MAXN][20],len[MAXN],ri[MAXN],le[MAXN];
char s[MAXN];
int Qmin(int l,int r) {
int t = len[r - l + 1];
return min(st[l][t],st[r - (1 << t) + 1][t]);
}
void Solve() {
read(N);
scanf("%s",s + 1);
for(int i = 1 ; i <= N ; ++i) {
if(s[i] == 'j') sum[i] = sum[i - 1] - 1;
else sum[i] = sum[i - 1] + 1;
st[i][0] = sum[i];
}
for(int i = 2 ; i <= N ; ++i) len[i] = len[i / 2] + 1;
for(int j = 1 ; j <= 18 ; ++j) {
for(int i = 1 ; i <= N ; ++i) {
if(i + (1 << j) - 1> N) break;
st[i][j] = min(st[i][j - 1],st[i + (1 << j - 1)][j - 1]);
}
}
for(int i = 1 ; i <= N ; ++i) {
if(s[i] == 'j') continue;
int L = i,R = N;
while(L < R) {
int mid = (L + R + 1) >> 1;
if(Qmin(i,mid) - sum[i - 1] >= 0) L = mid;
else R = mid - 1;
}
ri[i] = R;
}
memset(sum,0,sizeof(sum));
for(int i = N ; i >= 1 ; --i) {
if(s[i] == 'j') sum[i] = sum[i + 1] - 1;
else sum[i] = sum[i + 1] + 1;
st[i][0] = sum[i];
}
for(int j = 1 ; j <= 18 ; ++j) {
for(int i = 1 ; i <= N ; ++i) {
if(i + (1 << j) - 1 > N) break;
st[i][j] = min(st[i][j - 1],st[i + (1 << j - 1)][j - 1]);
}
}
for(int i = 1 ; i <= N ; ++i) {
if(s[i] == 'j') {le[i] = N;continue;}
int L = 1,R = i;
while(L < R) {
int mid = (L + R) >> 1;
if(Qmin(mid,i) - sum[i + 1] >= 0) R = mid;
else L = mid + 1;
}
le[i] = L;
}
for(int i = 1 ; i <= N ; ++i) st[i][0] = le[i];
for(int j = 1 ; j <= 18 ; ++j) {
for(int i = 1 ; i <= N ; ++i) {
if(i + (1 << j) - 1 > N) break;
st[i][j] = min(st[i][j - 1],st[i + (1 << j - 1)][j - 1]);
}
}
int ans = 0;
for(int i = 1 ; i <= N ; ++i) {
if(ri[i] >= i) {
int L = i,R = ri[i];
while(L < R) {
int mid = (L + R + 1) >> 1;
if(Qmin(mid,ri[i]) <= i) L = mid;
else R = mid - 1;
}
ans = max(ans,R - i + 1);
}
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar的更多相关文章
- 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar
t老师的做法好神…… 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...
- LOJ2430:[POI2014]沙拉餐厅Salad Bar——题解
https://loj.ac/problem/2430 是的我BZOJ又没卡过……懒得卡了. 参考:https://blog.csdn.net/zqh_wz/article/details/52887 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
随机推荐
- Java基础-面向接口(interface)编程
Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的“类 ...
- 解决body设置height:100%无效问题
1. 解决html设置height:100%无效问题 通常我们需要让自己的网页内容能够更好的适配各种屏幕大小,会采用height:100%,但是我们发现问题出来了,height:100%无效,其实解决 ...
- linq的语法和案例
本篇逐一介绍linq各个关键字的用法(from,select,group,into等),本篇所有的案例都是用linqpad来完成的(官方地址:http://www.linqpad.net/),建议想学 ...
- MacOS Sierra允许运行任何来源的程序
参考自http://bbs.feng.com/read-htm-tid-10584598.html Mac新系统 Sierra中默认已经看不到“任何来源”的选项,就无法安装很多的第三方程序,所以需要做 ...
- PHP官方文档之————secure.php.net.while
while 语句的含意很简单,它告诉 PHP 只要 while 表达式的值为 TRUE 就重复执行嵌套中的循环语句.表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行 ...
- spark-shell启动spark报错
前言 离线安装好CDH.Coudera Manager之后,通过Coudera Manager安装所有自带的应用,包括hdfs.hive.yarn.spark.hbase等应用,过程很是波折,此处就不 ...
- JAVA 急速WEB框架Blast-本人开发的JavaWeb急速框架Blast上线了
JAVA 急速WEB框架Blast ——对JavaWeb的学习性框架,参考了spring的实现 ——阅读Blast源码可以快速掌握JavaWeb常用技术和方法论,并付诸实践 Blast 是基于 Jav ...
- 如何写一个好bug
自己的总结,和大家分享~
- centos6安装elasticsearch6.0
环境准备 1台centos6操作系统主机,关闭selinux及iptables官方下载elasticsearch6.0软件包:https://artifacts.elastic.co/...官方下载j ...
- 小玩意1-实时获取IE浏览器输入框URL地址
主要参考http://www.cnblogs.com/scrat/archive/2012/09/12/2682626.html 主要思路如下: 通过 FindWindow() FindWindowE ...