题意

长度为\(n(1 \le n \le 1000000)\)的\(01\)字符串。找一个最长的连续子串\(S\),使得不管是从左往右还是从右往左取,都保证每时每刻已取出的\(1\)的个数不小于\(0\)的个数。

分析

首先对\(i\)求出\(l_i, r_i\),\(l_i\)表示在区间\([l_i, i]\)从左往右一直取,\(1\)的个数总是不少于\(0\)的个数的最远\(l_i\)。\(r_i\)同理。由于前缀和前后差绝对值为\(1\),所以我们可以开一个数组在\(O(n)\)内求出这\(l_i, r_i\)(比如求\(l_i\)就是我们只需要找一个满足\(sum_i+1=sum_j, j < i\)的最大\(j\))

然后我们对\(l_i\)升序排序(假设得到的顺序是\(b_i\))。然后从左到右扫过去,当前在\(i\)位置,每次更新满足\(l_{b_j} \le i\)的所有的\(b_j\)到区间\([b_j, n]\),然后对于\(i\),则向右能拓展到的位置就是区间\([1, i]\)的最大值。

题解

维护这个前缀最大值用个\(bit\)就行了。复杂度\(O(nlogn)\)。

#include <bits/stdc++.h>
using namespace std;
const int N=1000005;
int n, a[N], b[N+N], c[N+N], s1[N], s2[N], l[N], r[N], mx[N];
void add(int x, int g) {
for(; x<=n; x+=x&-x) {
mx[x]=max(mx[x], g);
}
}
int getmx(int x) {
int y=0;
for(; x; x-=x&-x) {
y=max(y, mx[x]);
}
return y;
}
void isort(int *y, int *x) {
for(int i=0; i<=n; ++i) c[i]=0;
for(int i=1; i<=n; ++i) c[y[i]]++;
for(int i=1; i<=n; ++i) c[i]+=c[i-1];
for(int i=1; i<=n; ++i) x[c[y[i]]--]=i;
}
int main() {
scanf("%d\n", &n);
for(int i=1; i<=n; ++i) {
a[i]=getchar()=='p'?1:-1;
}
for(int i=1, j=n; i<=n; ++i, --j) {
s1[i]=s1[i-1]+a[i];
s2[j]=s2[j+1]+a[j];
b[s1[i]+N]=b[s1[i]+1+N]=-1;
c[s2[j]+N]=c[s2[j]+1+N]=n+2;
}
for(int i=1, j=n; i<=n; ++i, --j) {
if(a[i]==1) {
l[i]=b[s1[i]+1+N]+2;
}
if(a[j]==1) {
r[j]=c[s2[j]+1+N]-2;
}
b[s1[i]+N]=i;
c[s2[j]+N]=j;
}
isort(l, b);
int nl=1, t, ans=0;
for(int i=1; i<=n; ++i) {
while(nl<=n && l[t=b[nl]]<=i) {
if(a[t]!=-1) {
add(t, t);
}
++nl;
}
if(a[i]!=-1) {
ans=max(ans, getmx(r[i])-i+1);
}
}
printf("%d\n", ans);
return 0;
}

【BZOJ】3521: [Poi2014]Salad Bar的更多相关文章

  1. 【BZOJ】3524: [Poi2014]Couriers

    [算法]主席树 [题解]例题,记录和,数字出现超过一半就递归查找. 主席树见[算法]数据结构 #include<cstdio> #include<algorithm> #inc ...

  2. 【BZOJ】3835: [Poi2014]Supercomputer

    题意 \(n(1 \le 1000000)\)个点的有根树,\(1\)号点为根,\(q(1 \le 1000000)\)次询问,每次给一个\(k\),每一次可以选择\(k\)个未访问的点,且父亲是访问 ...

  3. 【BZOJ】3832: [Poi2014]Rally

    题意 \(n(2 \le n \le 500000)\)个点\(m(1 \le m \le 1000000)\)条边的有向无环图,找到一个点,使得删掉这个点后剩余图中的最长路径最短. 分析 神题不会做 ...

  4. 【BZOJ】3526: [Poi2014]Card

    题意 \(n(n \le 200000)\)张卡片,正反有两个数\(a[i], b[i]\).\(m(m \le 1000000)\)次操作,每次交换\(c[i].d[i]\)位置上的卡片.每一次操作 ...

  5. 【BZOJ】3523: [Poi2014]Bricks

    题意 \(n(n \le 1000000)\)个物品,颜色分别为\(a[i]\),现在要求排在一排使得相邻两个砖块的颜色不同,且限定第一个砖块和最后一个砖块的颜色,输出一个合法解否则输出-1. 分析 ...

  6. 【BZOJ】3834: [Poi2014]Solar Panels

    http://www.lydsy.com/JudgeOnline/problem.php?id=3834 题意:求$max\{(i,j)\}, smin<=i<=smax, wmin< ...

  7. 【BZOJ】3524 [POI2014] Couriers(主席树)

    题目 传送门:QWQ 传送到洛谷QWQ 分析 把求区间第k大的改一改就ok了. 代码 #include <bits/stdc++.h> using namespace std; ; ], ...

  8. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  9. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

随机推荐

  1. HTML5学习笔记(持续更新中....)

    平时的工作中,不知不觉我们应用了很多HTML5,但当正儿八经问起来你对HTML5了解多少,很多时候都有点懵. 做个简单的HTML5总结.包括简介.要学的知识点.凌乱的知识点 HMTL5简介 定义:ht ...

  2. Q: ossfs挂载时如何设置权限?

    Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point ...

  3. Backbone 学习笔记

    Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户 ...

  4. Silicon C8051F340之时钟系统

    一.背景 做个记录,以备下次快速开发. 二.正文 C8051F340有一个可编程内部高频振荡器.一个可编程内部低频振荡器.一个外部振荡器驱动电路 和一个4倍时钟乘法器.其中可编程内部高频振荡器在系统复 ...

  5. PHP异常处理函数set_exception_handler()的用法

    定义和用法 set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 nul ...

  6. extractor

    package scrollable.excel.reader; import java.io.IOException; import java.io.InputStream; import java ...

  7. C#高级编程笔记 Day 6, 2016年9月 14日 (泛型)

    1.泛型类的功能:在创建泛型类时,还需要一些其他C#关键字.例如,不能把null赋予泛型类型.此时,可以使用default 关键字.如果泛型类型不需要Object类的功能,但需要调用泛型类上的某特定方 ...

  8. PHP中计划任务

    PHP不支持多线程,有时候处理问题不是那么爽,今天谈论一下PHP定时执行的方法 PHP定时执行的三种方式实现 .windows 的计划任务 .linux的脚本程序 .让web浏览器定时刷新 windo ...

  9. tornado 路由系统----扩展(include)

    在Tornado中实现Django分层路由 看了几个 Tornado 的 demo 发现都是一个py搞定所有,这样做做为例子来讲确实很直观,但如果在大型项目中这样做肯定不现实,所以博主考虑如何制定合理 ...

  10. sublime3侧边栏颜色修改,推荐主题

    sublime侧边栏的颜色默认是灰白色的,下面方法可以手动定制颜色为深色: 需要修改的文件为: C:\program\Sublime\Packages\Theme - Default.sublime- ...