链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3521

POI的题果然都有一些很精妙的O(n)O(n)O(n)做法
带log的比较简单,这里就不再赘述了
考虑一个区间怎么样是合法的
统计前缀和
假如一段区间[l,r][l,r][l,r]是合法的
那么必定满足sum[r]sum[r]sum[r]是最大的,sum[l−1]sum[l-1]sum[l−1]是最小的
于是固定一个rrr的时候,我们可以得到他的一个左端点LLL,满足这里所有的数sum[r]sum[r]sum[r]是最大的,这个用一个单调栈不难维护
于是去[L,r][L,r][L,r]中的最小值lll,那么[l,r][l,r][l,r]就是rrr所能贡献的最大答案了
对于r端点递增,每一次寻找最小值,可以用并查集维护
就可以做到O(n)O(n)O(n)了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000005;
int f[N];
int find_fa (int x) {return f[x]==x?f[x]:f[x]=find_fa(f[x]);}
int n;
char ss[N+1];
int sum[N];
int sta[N],top;
int sta1[N],top1;
int main()
{scanf("%d",&n);scanf("%s",ss+1);int ans=0;top=1;sta[top]=0;for (int u=1;u<=n;u++){f[u]=u;sum[u]=sum[u-1]+(ss[u]=='p'?1:-1);while (top>0&&sum[sta[top]]>sum[u])   {f[find_fa(sta[top])]=u;top--;}sta[++top]=u;while (top1>0&&sum[sta1[top1]]<=sum[u]) top1--;int L=sta1[top1];if (L!=0) L++;sta1[++top1]=u;int now=u-find_fa(L);ans=ans>now?ans:now;}printf("%d\n",ans);return 0;
}

bzoj 3521: [Poi2014]Salad Bar相关推荐

  1. POI2014 Salad Bar

    Salad Bar POI2014 题意 1.有一个长度为n的字符串,每一位只会是p或j. 2.找到一个子串S,使得不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数. 3.求 ...

  2. [POI2014]Salad Bar

    题目大意: 一个长度为$n(n\leq10^6)$的字符串,每一位只会是$p$或$j$.你需要取出一个子串$S$(从左到右或从右到左一个一个取出),使得不管是从左往右还是从右往左取,都保证每时每刻已取 ...

  3. BZOJ3521: [Poi2014]Salad Bar

    维护p-j的前缀和sum[i],那么一段l~r合法的充要条件是sum[l]<=sum[l~r],sum[r]>=sum[l~r],即中间的所有sum都>=sum[l],<=su ...

  4. P3564 [POI2014]BAR-Salad Bar(ST表 + 二分)

    P3564 [POI2014]BAR-Salad Bar 给定一个长度为nnn的数组,里面元素只有111跟−1-1−1,问选出一个长度为lenlenlen的区间使得,这个区间的前缀和时刻大于零,后缀和 ...

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

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

  6. 【LOJ】#2430. 「POI2014」沙拉餐厅 Salad Bar

    题解 波兰人的j是苹果,p是橘子 还真是跟中国过不去啊= =写的时候很难受 我们先求出每个点作为起点,能延伸到的最大长度,这个可以处理成前缀和,查询一下区间最小值是不是小于0,用st表实现,如果区间最 ...

  7. BZOJ 3524: [Poi2014]Couriers【主席树】

    3524: [Poi2014]Couriers [题目描述] 传送门 [题解] 主席树的裸题,要找出现次数大于一半的,那么他肯定出现在当前的左子树或右子树中,就这样查找就可以了. 代码如下 #incl ...

  8. [Luogu P3571] [BZOJ 3835] [POI2014]SUP-Supercomputer

    洛谷传送门 BZOJ传送门 题目描述 给定一棵NNN个节点的有根树,根节点为111.QQQ次询问,每次给定一个KKK,用最少的操作次数遍历完整棵树,输出最少操作次数.每次操作可以选择访问不超过KKK个 ...

  9. BZOJ.3524.[POI2014]Couriers(主席树)

    题目链接 //119964kb 5780ms //主席树裸题啊.. #include <cstdio> #include <cctype> #define gc() getch ...

最新文章

  1. 神级总结:七种功能强大的聊天机器人平台
  2. kail linux安装软件提示“无法定位软件包”解决方法
  3. redis 生成dump.rdb文件
  4. grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
  5. 机房收费系统重构之存储过程的使用
  6. 两字典(dict)组合(重复键进行加法)一行命令实现Python
  7. 在有序但含有空的数组中查找字符串
  8. redissession有容量上限吗_传输线的功率容量
  9. [JUC-4]ThreadPoolExecutor源码分析
  10. python第七天--字符串的方法与注释
  11. python项目构建_通过构建4个项目来学习Python网络
  12. 前端学习(1668):前端系列实战课程之限制范围拖拽思路
  13. SQLite数据库---ListView控件之商品展示案例
  14. c++随机打乱数组_编程之路之php数组操作详解【文末有惊喜】
  15. 读后感Java多线程编程核心技术十二
  16. r 对一列计数_根据另一列对项目进行计数
  17. ArcGIS 10安装方法(对比流行的2种安装方法)||迅雷电驴下载地址
  18. LeetCode874 模拟行走机器人
  19. QQ音乐for Mac 已经登陆MAC OSX
  20. 手写Vuex核心原理,再也不怕面试官问我Vuex原理

热门文章

  1. SQL Server中的约束(六种约束)
  2. IE11卸载不掉的问题
  3. 2019-01-07 16:35:40 18616 [Warning] Slave SQL: Could not execute Query event. Detailed error: ;, Err
  4. 记录小知识:Arouter 组件间通讯实体类数据
  5. Python基础教程(第2版)第五章 条件、循环和其他语句
  6. Python中函数的常见操作(创建、调用、递归函数等等)【非常详细】
  7. 给中年工程师的忠告 转自前辈工程师 “嵌入式玩家”
  8. 解决虚拟机中Win7系统无法安装vmware tools问题
  9. kali下载中文输入法
  10. 运用python进行熵值法综合评价