$$ 高考结束了,前退役 \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)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. sqlmap:wins系统+python3上安装

    python2和python3互不兼容,SqlMap是基于python2的,所以SqlMap不支持python3,这里使用virtualenvwrapper切换python版本: 一.sqlmap的安 ...

  4. jq处理JSON数据, jq Manual (development version)

    jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...

  5. 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 ...

  6. java -version 问题

    我把 JAVA_HOME 从8改成了 7 , 为什么还是 显示的8啊 ! E:\sv0\jars>java -version java version "1.8.0_111" ...

  7. 记一次jdk升级引起的 Unsupported major.minor version 51.0

    之前jdk 一直是1.6,tomcat 是6.x 版本,, 现在引入的新的jar, 出现 Caused by: java.lang.UnsupportedClassVersionError: org/ ...

  8. 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=" ...

  9. 在idea中maven项目jdk编译version总是跳到1.5

    bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5.0. 每次手动去setting里修改comp ...

  10. 未能加载文件或程序集“Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5”或它的某一个依赖项。系统找不到指定的文件。

    在创建ASP.NET MVC项目过程中发生了这个异常 未能加载文件或程序集"Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0 ...

随机推荐

  1. 从零开始,打造一款属于自己的JavaScript编程语言

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  2. Dify实战案例《AI面试官》更新,支持语音交互+智能知识库+随机题库+敏感词过滤等...

    大模型应用课又更新了,除了之前已经完结的两门课(视频+图文): <Spring AI 从入门到精通> <LangChain4j 从入门到精通> 还有目前正在更新的 <Di ...

  3. 游戏开发godot+mcp等于事半功倍,分享一下如何安装godot相关的mcp及有何作用

    游戏开发godot+mcp等于事半功倍,分享一下如何安装godot相关的mcp及有何作用 总结 视频讲解: https://www.bilibili.com/video/BV1P9jRzXEXU 在使 ...

  4. elasticsearch分词

    阅读说明: 1.如果有排版格式问题,请移步https://www.yuque.com/mrhuang-ire4d/oufb8x/gmzl30v8ofqg3ua3?singleDoc# <elas ...

  5. PHP数据结构当中的栈

    本文由 ChatMoney团队出品 栈(Stack)是一种后进先出(Last In First Out, LIFO)的数据结构,它只允许在一端(称为栈顶)进行插入和删除操作.栈的应用非常广泛,例如在编 ...

  6. 一个基于 .NET 开源、模块化 AI 图像生成 Web 用户界面

    前言 今天大姚给大家分享一个基于 .NET 开源.模块化 AI 图像生成 Web 用户界面:SwarmUI. 项目介绍 SwarmUI (原 StableSwarmUI)是一个基于 .NET 开源(M ...

  7. AEM6.5集成Redis详细步骤(附代码)

    一.环境准备 Redis 安装 2.配置 Redis 远程访问 二.AEM 端配置 1.添加 Redis 客户端依赖 在 AEM 项目的pom.xml中添加: <dependency> & ...

  8. 新起点!大数据分布式可视化的 DAG 任务调度系统 Taier 正式发布1.4版本

    我们很高兴向大家宣布,2023年4月14日,Taier 正式发布 1.4 版本.自2022年2月份 Taier 正式开源以来,收到了很多开发者和行业用户的积极评价,在诸多生产环境中已得到充分应用.Ta ...

  9. 开源技术交流丨ChengYing部署Hadoop集群实战

    一.直播介绍 上期雅泽同学对ChengYing是什么.有什么样的功能特性,如何快速入门做了介绍,本期海洋同学将会为大家分享ChengYing部署Hadoop集群实战的相关内容,欢迎大家积极参与. 二. ...

  10. ArcObjects SDK 019 SpatialReference

    1.SpatialReference的结构 ArcObjects SDK帮助中Esri.ArcGIS.Geometry命名空间帮助中的Object Model Diagram共两页,第一页就是Geom ...