题解

波兰人的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的更多相关文章

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

    t老师的做法好神…… 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...

  2. LOJ2430:[POI2014]沙拉餐厅Salad Bar——题解

    https://loj.ac/problem/2430 是的我BZOJ又没卡过……懒得卡了. 参考:https://blog.csdn.net/zqh_wz/article/details/52887 ...

  3. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  4. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

随机推荐

  1. IOS计算文字高度

    1.计算文字长度 NSString* str = @"你好"; .f; NSStringDrawingOptions options = NSStringDrawingUsesLi ...

  2. python---web微信开发

    一:轮询,长轮询,WebSocket了解 轮询: 在前端,设置时间内,一直向后端发送请求.例如:使用setInterval方法设置定时器,一秒向后端发送一次请求,去主动获取数据,进行更新由于前端一直请 ...

  3. JavaScript中数组迭代方法

    文章来源 : https://www.cnblogs.com/shuiyi/p/5058524.html

  4. soj1762.排座椅

    1762. 排座椅 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 上课的时候总有一些同学和前后左右的人交头接耳,这是令 ...

  5. HDU 4690 EBCDIC 2013 Multi-University Training Contest 9

    解题报告:一个模拟题,有两张表格,然后输入一个字符在第一章表格中的位置,让你找出这个字符在第二章表对应的位置. 我欧诺个的是暴力打表,输了两百多个数字,时间复杂度直接降到O(1),这题觉得比较坑的就是 ...

  6. 【leetcode 简单】 第七十八题 Nim游戏

    你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断你 ...

  7. AAC编码

    1. 前言 如果说目前H.264是视频CODEC的实际霸主,那么AAC就是音频CODEC的女王.主流的音视频格式都是H.264搭配AAC,无论是非实时的媒体文件还是实时的媒体流. 2. AAC历史 A ...

  8. 【译】第一篇 Integration Services:SSIS是什么

    本篇文章是Integration Services系列的第一篇,详细内容请参考原文. Integration Services是一种在SQL Server中最受欢迎的子系统.允许你在各种数据源之间提取 ...

  9. js 语法简写积累

    if (!a || !b || !c || !d){//} 简写为:if([a, b, c, d].map(Boolean).includes(false)){//};

  10. Unity 3(一):简介与示例

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): Ioc/DI简介: Unity简单示例 一.Ioc/DI简介 IoC 即 Inversion of C ...