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

P3564 [POI2014]BAR-Salad Bar

给定一个长度为nnn的数组,里面元素只有111−1-11,问选出一个长度为lenlenlen的区间使得,这个区间的前缀和时刻大于零,后缀和时刻大于零,输出最大长度lenlenlen

考虑枚举lll端点,我们可以二分出最大的rrr,满足pre_sumpre\_sumpre_sum时刻大于等于零,设为[l,r][l, r][l,r]

考虑枚举RRR端点,我们可以二分出最小的LLL,满足suc_sumsuc\_sumsuc_sum时刻大于等于零,设为[L,R][L, R][L,R]

则答案一定是在所有上述点对中的l,Rl, Rl,R中的一个,且有l≤R≤rl \leq R \leq rlRrL≤l≤RL \leq l \leq RLlR

假设我们已经把上述满足要求的两种点对都算出来了,考虑新开一个线段树,

我们把第二种点对[L,R][L, R][L,R],放进线段树上维护,在RRR点记录符合要求的最小的LLL

考虑枚举[l,r][l, r][l,r]点对,在区间[l,r][l, r][l,r]中寻找一个最大的RRR,使得于RRR相对应的LLL,满足L≤lL \leq lLl,这个时候我们的答案就是R−l+1R - l + 1Rl+1的最大值了。

上述操作都利用STSTST表,然后二分一下即可,整体复杂度O(nlog⁡n)O (n \log n)O(nlogn)

#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10, logn = 20;int a[N], sum[N], b[N], Log[N], f[N][logn + 1], n;char str[N];vector<pair<int, int>> vt, v;void init() {Log[1] = 0, Log[2] = 1;for (int i = 3; i < N; i++) {Log[i] = Log[i / 2] + 1;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);init();scanf("%d %s", &n, str + 1);for (int i = 1; i <= n; i++) {a[i] = str[i] == 'p' ? 1 : -1;}for (int i = 1; i <= n; i++) {sum[i] = a[i] + sum[i - 1], f[i][0] = sum[i];}for (int j = 1; j <= logn; j++) {for (int i = 1; i + (1 << j) - 1 <= n; i++) {f[i][j] = min(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);}}for (int i = 1; i <= n; i++) {if (a[i] == -1) {continue;}int l = i, r = n;while (l < r) {int mid = l + r + 1 >> 1, s = Log[mid - i + 1];if (min(f[i][s], f[mid - (1 << s) + 1][s]) >= sum[i - 1]) {l = mid;}else {r = mid - 1;}}// printf("%d %d\n", i, l);vt.push_back({i, l});}for (int i = 1; i <= n; i++) {sum[i] = a[n - i + 1] + sum[i - 1], f[i][0] = sum[i];}for (int j = 1; j <= logn; j++) {for (int i = 1; i + (1 << j) - 1 <= n; i++) {f[i][j] = min(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);}}memset(b, 0x3f, sizeof b);for (int i = 1; i <= n; i++) {if (a[n - i + 1] == -1) {continue;}int l = i, r = n;while (l < r) {int mid = l + r + 1 >> 1, s = Log[mid - i + 1];if (min(f[i][s], f[mid - (1 << s) + 1][s]) >= sum[i - 1]) {l = mid;}else {r = mid - 1;}}b[n - i + 1] = n - l + 1;// printf("%d %d\n", n - l + 1, n - i + 1);}for (int i = 1; i <= n; i++) {f[i][0] = b[i];}for (int j = 1; j <= logn; j++) {for (int i = 1; i + (1 << j) - 1 <= n; i++) {f[i][j] = min(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);}}int ans = 0;for (auto it : vt) {int L = it.first, R = it.second;int l = it.first, r = it.second;while (L < R) {// [mid + 1, r]int mid = L + R >> 1, s = Log[r - mid];if (min(f[mid + 1][s], f[r - (1 << s) + 1][s]) <= l) {L = mid + 1;}else {R = mid;}}ans = max(ans, L - l + 1);}printf("%d\n", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【招聘(深圳)】迈瑞招.NET 开发Leader和PM

应用开发管理&#xff08;开发leader&#xff09;工作职责&#xff1a;1.负责应用开发小组管理&#xff1b;2.协助项目经理制定项目计划和控制项目进度&#xff1b;3.评估用户需求&#xff0c;设计解决方案、系统功能&#xff0c;并带领开发小组进行交付&#xff1b;4.对开发过…

Java RMI,Socket,HttpClient

Java RMI Java远程方法调用&#xff08;Java Remote Method Invocation&#xff09; 是Java编程语言里&#xff0c;一种用于实现远程过程调用的应用程序编程接口。 它使客户机上运行的程序可以调用远程服务器上的对象。 远程方法调用特性使Java编程人员能够在网络环境中分布操…

E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)

E. Sign on Fence 给定一个长度为nnn的数组aaa&#xff0c;1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai​≤109&#xff0c;有mmm次询问&#xff0c;每次给定l,r,kl, r, kl,r,k&#xff0c;要我们在[l,r][l, r][l,r]区间内找到一个长度为kkk的区间&#xff0c;使得区间最小值最大&…

AutoMapper多个对象映射到一个Dto对象

一、定义源映射对象为了体现AutoMapper映射特性&#xff0c;在SocialAttribute中的Name属性没有定义在People中&#xff0c;People的Ear属性也不存在与SocialAttribute和PhysicalAttribute中。代码如下&#xff1a;二、注入AutoMapper例子中使用的IOC容器是Autofac&#xff0c;…

cookie 与 session

1 背景介绍 什么是会话&#xff1f; 用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话。我们知道&#xff0c;HTTP协议是一种"无状态"协议&#xff0c;客户浏览器与服务器建立连接&#xff0c;发出请求&#x…

Java写一个简单的静态文件的HTTP服务器(基于Socket)

** 一、实现思路 ** 1、使用 ServerSocket 监听某一端口&#xff0c;然后等待连接获取 Socket对象。 2、创建一个类 HttpServer 继承 java.lang.Thread 类&#xff0c;重写 run()方法&#xff0c;执行浏览器请求。 3、获得浏览器请求&#xff0c;解析资源文件路径。 4、读…

P2839 [国家集训队]middle(二分 套 主席树)

P2839 [国家集训队]middle 有一个长度为nnn的序列&#xff0c;有mmm次询问&#xff0c;每次询问a,b,c,da, b, c, da,b,c,d&#xff0c;为l∈[a,b],r∈[c,d]l \in [a, b], r \in [c, d]l∈[a,b],r∈[c,d]&#xff0c;[l,r][l, r][l,r]区间的中位数最大是多少&#xff0c;强制在…

asp.net core 使用HttpClientFactory Polly实现熔断降级

前言在NET Core2.1后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式通常不是最好的选择。处理HttpClient,底层socket套接字不会立即释放。该HttpClient类是未多个请求重复使用而创建的。…

.NET生态系统概览

本文要点.NET 5 预计会在 2020 年发布&#xff0c;届时将统一所有.NET 平台。在进行特性开发时优先考虑性能。C#语言的发展直接推动了开发者的采用。开源社区让.NET 生态系统变得更好。2002 年&#xff0c;.NET 发布。在接下来的 12 年多时间里&#xff0c;.NET 开发社区以看似…

P1848 [USACO12OPEN]Bookshelf G(线段树优化 DP)

P1848 [USACO12OPEN]Bookshelf G 有nnn间物品&#xff0c;每个物品有两个属性Wi,HiW_i, H_iWi​,Hi​&#xff0c;宽度跟高度&#xff0c;要求把这nnn件物品划分成若干连续的组&#xff0c;每组内∑Wi≤L\sum\limits W_i \leq L∑Wi​≤L&#xff0c;并且要求最小化每组最大高…

Java 实现 FTP 服务

1、FTP简介 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的…

L. Continuous Intervals(单调栈 + 线段树 + 思维)

L. Continuous Intervals 给定一个长度为nnn的数组&#xff0c;问里面有多少个区间[l,r][l, r][l,r]&#xff0c;满足&#xff0c;对这个区间排序后&#xff0c;两两差值$ \leq 1$&#xff0c;输出区间个数。 如果说区间[l,r][l, r][l,r]是符合要求的&#xff0c;则满足max(a…

Azure Application Insights REST API使用教程

本文是Azure Application Insights REST API的简单介绍&#xff0c;并会包含一个通过Python消费API的示例/小工具。新加入的team中的一项工作是制作日常的运维报表&#xff0c;制作方式是手工前往portal.azure.com&#xff0c;在网页中多次执行不同的查询语句、导出excel&#…

用Java Socket实现SMTP邮件发送

目录&#xff1a; 1、邮件基础概念2、Java Mail API介绍3、收发邮件代码示例 PS&#xff1a;如果你想直接拿代码用&#xff0c;可以直接跳到第3部分。 ** 一、邮件基础概念 ** 1.1 邮件服务器和电子邮箱 要在Internet上提供电子邮件功能&#xff0c;必须有专门的电子邮件…

微软开源新字体Cascadia Code,源于Windows Terminal

微软开源了一套新的字体 Cascadia Code。Cascadia Code 是微软在 5 月份的 Build 大会上宣布推出的等宽字体&#xff0c;微软介绍它是与新的终端 Windows Terminal 一起开发的&#xff0c;官方建议将其与终端应用和 VS、VS Code 等文本编辑器一起使用。Cascadia Code 为命令行和…

C. Safe Distance(二分 + 并查集)

C. Safe Distance&#xff08;二分 并查集&#xff09; 给定一个XYX \times YXY的矩形&#xff0c;里面有n,(1≤n≤1000)n,(1 \leq n \leq 1000)n,(1≤n≤1000)个点&#xff0c;我们要从点(0,0)(0, 0)(0,0)走到(X,Y)(X, Y)(X,Y)&#xff0c;我们要使过程中与这nnn个点的最小距…

进程间通讯的7种方式

1、常见的通信方式 管道pipe&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO&#xff1a;有名管道也是半双工的通信方式&#xff0c;但是它允许无亲缘…

官宣!VS Code Python 全新功能在 PyCon China 全球首发!

北京时间 2019 年 9 月 21 日&#xff0c;PyCon China 2019 在上海举行。在下午的演讲中&#xff0c;来自微软开发工具事业部的资深研发工程师在演讲中&#xff0c;我们看到了 Azure Notebook 与 VS Code 对 Python 的强大的支持。然而&#xff0c;鱼和熊掌似乎不可兼得。Jupyt…

什么是CDN

一、cdn简介 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其目的是通过在现有的internet中增加一层新的网络架构&#xff0c;将网站的内容发布到最接近用户的网络边缘&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的响应速度。…

数列递推(牛客练习赛83)(数学、分块)

数列递推 给定f(0)f(0)f(0)&#xff0c;定义fn∑i1nf(nmodi)f_n \sum\limits_{i 1} ^{n} f_{(n \mod i)}fn​i1∑n​f(nmodi)​&#xff0c;求f1,f2,f3,…,fn−1,fnf_1, f_2, f_3, \dots, f_{n - 1}, f_{n}f1​,f2​,f3​,…,fn−1​,fn​。 ∑i1nf(nmodi)∑i1nf(n−nii)\su…