重生之 CF2126G2. Big Wins! (hard version)
$$ 高考结束了,前退役 \text{Oie} 要开始 \text{Ta} 的 \text{ACM} 生活了。 $$
前置:一个区间的 \(med \geq x\) 等价于若将 \(a_i \geq x\) 的元素赋值为 \(1\) ,其余赋值为 \(-1\) ,元素之和 \(\geq 0\)
本题没有限制\(\text{ a[i]}\) 的大小,也就是没有限制 \(med\) 的大小。第一个想法是枚举 \(\text{min}\) 值,对每一个 \(a_i = min\) 的位置用单调栈或者笛卡尔树计算能保持最小值的 \(l_i\) 和 \(r_i\) ,然后我们考虑这个区间内的 \(med\),复杂度为 \(O(n^2 \log n)\) 。
我们考虑如果从小到大枚举 \(med\) ,依次更新每个 \(min\) 值对应的 \(med\) 看能否取到,很可惜,这样也只能做到 \(O(n^2 \log n)\)。
但是我们注意到,刚刚的对每个min求med是没有必要的,我们只是想知道他们的最大差值,那么我们不妨从小到大枚举每个\(min\),并且在线段树中进行修改,对于同一个\(min\),我们可以不断尝试让 \(med\) 增大,直到顶到上限。同时由于我们枚举的区间的 \(min\) 值不断上升,若想要更新答案,\(med\) 值必然要增大才会有可能更优,二者均单调递增,复杂度优化至 \(O(n\log n)\)
点击查看代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int T,n,a[N];vector<int> pos[N];
int al[N],ar[N];
inline void read(int &x)
{
int f=1;char c;
for(x=0,c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f;
}
inline int mn(int _x,int _y){return _x<_y?_x:_y;}
inline int mx(int _x,int _y){return _x>_y?_x:_y;}
inline int ab(int _x){return _x<0?-_x:_x;}
struct node{
int sum;int premx;int sufmx;
};
node val[N<<2];
inline node pushup(node a,node b){
node c;
c.sum=a.sum+b.sum;
c.premx=mx(a.premx,a.sum+b.premx);
c.sufmx=mx(a.sufmx+b.sum,b.sufmx);
return c;
}
inline void update(int x,int l,int r,int pos){
if(l==r){val[x]=(node){-1,-1,-1};return ;}
int mid=l+r>>1;
if(pos<=mid) update(x<<1,l,mid,pos);
if(pos>mid) update(x<<1|1,mid+1,r,pos);
val[x]=pushup(val[x<<1],val[x<<1|1]);
return ;
}
inline node query(int x,int l,int r,int ql,int qr){
if(ql>qr) return (node){0,0,0};
if(ql<=l&&r<=qr) return val[x];
int mid=l+r>>1;
if(qr<=mid) return query(x<<1,l,mid,ql,qr);
else if(ql>mid) return query(x<<1|1,mid+1,r,ql,qr);
else return pushup(query(x<<1,l,mid,ql,qr),query(x<<1|1,mid+1,r,ql,qr));
}
inline void build(int x,int l,int r){
val[x]=(node){r-l+1,r-l+1,r-l+1};
if(l==r) return ;
int mid=l+r>>1;
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
return ;
}
int sta[N],stp;
inline void Solve(){
read(n);
for(int i=1;i<=n;i++){
read(a[i]);pos[i].clear();
}
for(int i=1;i<=n;i++) pos[a[i]].push_back(i);
build(1,1,n);int med=1,ans=0;
stp=0;
for(int i=1;i<=n;i++){
while(stp>=1&&a[sta[stp]]>a[i]){
ar[sta[stp]]=i-1;--stp;
}
sta[++stp]=i;
}
while(stp>=1){ar[sta[stp]]=n;--stp;}
stp=0;
for(int i=n;i>=1;i--){
while(stp>=1&&a[sta[stp]]>a[i]){
al[sta[stp]]=i+1;--stp;
}
sta[++stp]=i;
}
while(stp>=1){al[sta[stp]]=1;--stp;}
for(int i=1;i<=n;i++){
for(int j=0;j<pos[i].size();j++){
int p=pos[i][j];
while(med<=n&&mx(query(1,1,n,al[p],p-1).sufmx,0)+(a[p]<med?-1:1)+mx(0,query(1,1,n,p+1,ar[p]).premx)>=0){
ans=mx(ans,med-a[p]);
for(int t=0;t<pos[med].size();t++) update(1,1,n,pos[med][t]);
++med;
}
}
}
printf("%d\n",ans);return ;
}
int main()
{
read(T);
while(T--) Solve();
return 0;
}
重生之 CF2126G2. Big Wins! (hard version)的更多相关文章
- Microsoft SQL Server Version List [sqlserver 7.0-------sql server 2016]
http://sqlserverbuilds.blogspot.jp/ What version of SQL Server do I have? This unofficial build ch ...
- Microsoft SQL Server Version List(SQL Server 版本)
原帖地址 What version of SQL Server do I have? This unofficial build chart lists all of the known Servic ...
- sqlmap:wins系统+python3上安装
python2和python3互不兼容,SqlMap是基于python2的,所以SqlMap不支持python3,这里使用virtualenvwrapper切换python版本: 一.sqlmap的安 ...
- jq处理JSON数据, jq Manual (development version)
jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...
- ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0
ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...
- java -version 问题
我把 JAVA_HOME 从8改成了 7 , 为什么还是 显示的8啊 ! E:\sv0\jars>java -version java version "1.8.0_111" ...
- 记一次jdk升级引起的 Unsupported major.minor version 51.0
之前jdk 一直是1.6,tomcat 是6.x 版本,, 现在引入的新的jar, 出现 Caused by: java.lang.UnsupportedClassVersionError: org/ ...
- Java–cvc-complex-type.4:Attribut ‘version’ must appear on element ‘web-app’
问题解析: 在web.xml中的以下代码中 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=" ...
- 在idea中maven项目jdk编译version总是跳到1.5
bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5.0. 每次手动去setting里修改comp ...
- 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。
在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...
随机推荐
- 为什么使用MQ
在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 开发中消息队列通常有如下应用场景: 1.任务异步处理 ...
- MySQL 把查询结果更新或者插入到新表
摘要:在MySQL数据库,把查询到的多条记录复制到另一张表中.复制通常包括两种场景,一种是使用update命令更新旧数据,另一种是使用insert命令插入新记录. 需求背景:在某些业务中,需要把查询到 ...
- 红色教育软件需求分析 NABCD
N(need) 红色教育指在以红色作为时代精神内涵的象征.务实的落点在于教育.要呼唤有志青年忧国忧民.挑战自我.超越自我.挑战极限.奉献社会的崇高精神.而我们大学生作为实现中华民族伟大复兴的有生力量, ...
- 打工人必备!2025年最强任务管理软件Top5测评推荐
前言:谁偷走了我们的时间? 你是否也有这样的经历: 今天本来打算写一份PPT,结果临时被拉去开会,文档又拖到了明天: 任务堆成山,却总忘记哪个最重要: 同事催你对接.老板问你进度,你满脑子问号-- 这 ...
- centos7.5安装mariadb
一.安装mysql 这里我们基础系统是centos7.5 [root@monitor ~]# yum install -y mariadb-server [root@monitor ~]# syste ...
- 推荐五大AI+MCP自动化测试工具!
在当今快速发展的软件行业,自动化测试已成为提升开发效率和产品质量的关键.今天,我们将给大家推荐五大MCP自动化测试工具,助你在自动化测试领域更进一步. 1.MCP介绍 首先,你得知道,MCP是什么? ...
- 开源直播课丨大数据集成框架ChunJun类加载器隔离方案探索及实践
本期我们带大家回顾一下无倦同学的直播分享<ChunJun类加载器隔离>,ChunJun类加载器隔离的方案是我们近期探索的一个新方案,这个方案目前还不是非常成熟,希望能借由此次分享与大家一起 ...
- MKL普通矩阵运算示例及函数封装
本示例将介绍MKL中的矩阵乘法和求逆,使用MKL进行此类大型矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩 ...
- C#脚本化(Roslyn):如何在运行时引入nuget包
假设我们开发了一个C#脚本编辑器,利用Roslyn去执行用户所编写的脚本.这时候,如果用户想要引用一个nuget包,应该如何实现呢? 我们想要引用nuget包的话,只要能得到nuget包及其依赖包的所 ...
- AB Testing基础与Python实战(二)支付宝营销策略效果分析
1. 数据来源 本文所用数据集来自阿里云天池: 阿里云天池 - Audience Expansion Datasethttps://tianchi.aliyun.com/dataset/50893 该 ...