题解

波兰人的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 ivorysifreopen("f1.in","r",stdin);
#endifSolve();
}

转载于:https://www.cnblogs.com/ivorysi/p/9203861.html

【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar相关推荐

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

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

  2. Loj #3055. 「HNOI2019」JOJO

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

  3. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  4. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  5. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  6. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  7. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  8. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  9. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

最新文章

  1. 在Windows 7下面IIS7的安装和 配置ASP的正确方法
  2. Flink Window基本概念与实现原理
  3. HDU2023 求平均成绩
  4. hadoop hive 2.1.1 将Hive启动为服务
  5. Python钉钉报警及Zabbix集成钉钉报警
  6. VS2010 VS2012版最常用的快捷键
  7. 如何让测试同学理解并发锁
  8. 《电子数据取证》读书笔记-第一章
  9. window环境下Redies安装和服务启用
  10. Linux应急响应排查
  11. 【云原生】AI云开发平台——AI Model Foundry介绍(开发者可免费体验AI训练模型)
  12. 重磅!美图技术团队发布开源 ethereum dpos 实现
  13. cve-2008-4609一把梭
  14. File类详解(获取文件名称、大小、路径、创建等)
  15. php 限制微信登陆,thinkphp 微信用户登录 设置问题
  16. MapReduce案例:手机流量的统计
  17. 计算机共享无法打印机共享的打印机,如果打印机共享无法打印,该怎么办,教您解决计算机打印机共享无法打印的问题...
  18. 老码农回答为什么会有“在X有Y年的工作经验“这样的要求
  19. 【第32篇】SWA:平均权重导致更广泛的最优和更好的泛化
  20. 达人评测 iPad mini 5和mini 6 选哪个好

热门文章

  1. 马化腾加持开源,参与构建全球科技共同体
  2. 电子科技大学计算机2019报名人数,电子科技大学录取分数线2019(在各省市录取数据)...
  3. 晶体封装越小esr越大_晶振
  4. mysql的大字段clob,Oracle数据库导出大字段(CLOB)数据
  5. vue 防止按钮重复点击
  6. js 正则表达式判断价格
  7. c语言time.h时区不对,用C语言修改系统时区,发现一堆问题,请各位大侠不吝赐教。...
  8. eclipse插件开发(四) 流程图绘制插件(雏形)
  9. springboot中mongodb自定义类型转换器
  10. nacos 启动_【Nacos源码之配置管理 一】阅读源码第一步,本地启动Nacos