博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】3521: [Poi2014]Salad Bar
阅读量:7173 次
发布时间:2019-06-29

本文共 1785 字,大约阅读时间需要 5 分钟。

题意

长度为\(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 
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;}

转载地址:http://gvbzm.baihongyu.com/

你可能感兴趣的文章
性能优化3--数据库优化
查看>>
JavaScript知识点回顾
查看>>
关于浏览器兼容处理的几种方式
查看>>
第一个Asp.net小项目,主页写了下后台代码
查看>>
(推荐使用)SpringMVC注解,基本配置
查看>>
ORA-12547: TNS:lost contact+oracle 开启监听失败
查看>>
软件工程结对作业01(四则运算网页版)
查看>>
解决开机自动调用脚本失败的问题
查看>>
LoadRunner监控图表与配置(二)监控运行状况和交易状况
查看>>
创建对象的几种方式
查看>>
《鸟哥的Linux私房菜》读书笔记--第0章 计算机概论 硬件部分
查看>>
02、学PHP可以干什么
查看>>
iOS - WXPay 微信支付
查看>>
tcp/ip高效编程总结
查看>>
hdu 4739 Zhuge Liang's Mines 2013 ACM/ICPC Asia Regional Hangzhou Online
查看>>
陈远波(java)--Git 入门
查看>>
动态新增文本框
查看>>
消息队列
查看>>
类型和成员基础
查看>>
【Java】同步阻塞式(BIO)TCP通信
查看>>