AT_abc248_h [ABC248Ex] Beautiful Subsequences 题解

题目传送门

前置知识

树状数组 | 序列分治

解法

考虑序列分治,设因 \(\max\)\(\min\) 形成的分节点先后为 \(k_{1},k_{2}\)

对于 \(j \in (mid,k_{1}]\),等价于统计满足 \(\max\limits_{h=i}^{mid} \{ a_{h} \}-\min\limits_{h=i}^{mid} \{ a_{h} \} \le j-i+k\)\(j\) 的数量,容易求解。

对于 \(j \in (k_{1},k_{2}]\),以 \([i,j]\)\(\max\) 落在 \((k_{1},k_{2}]\) 为例,需要统计满足 \(\max\limits_{h=mid+1}^{j} \{ a_{h} \}-\min\limits_{h=i}^{mid} \{ a_{h} \} \le j-i+k\)\(j\) 数量,移项得到 \(\max\limits_{h=mid+1}^{j} \{ a_{h} \}-j \le \min\limits_{h=i}^{mid} \{ a_{h} \}-i+k\),移动指针的过程中树状数组维护 \(\max\limits_{h=mid+1}^{j} \{ a_{h} \}-j\) 的桶数组即可。

对于 \(j \in (k_{2},r]\),需要统计 \(\max\limits_{h=mid+1}^{j} \{ a_{h} \}-\min\limits_{h=mid+1}^{j} \{ a_{h} \} \le j-i+k\)\(j\) 数量,移项得到 \(\max\limits_{h=mid+1}^{j} \{ a_{h} \}-\min\limits_{h=mid+1}^{j} \{ a_{h} \}-j \le -i+k\),移动指针的过程中树状数组维护 \(\max\limits_{h=mid+1}^{j} \{ a_{h} \}-\min\limits_{h=mid+1}^{j} \{ a_{h} \}-j\) 的桶数组即可。

注意下标移位。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
int a[140010],pre_max[140010],pre_min[140010],n,m;
ll ans=0;
struct BIT
{int c[500010];int lowbit(int x){return (x&(-x));}void add(int n,int x,int val){for(int i=x;i<=n;i+=lowbit(i)){c[i]+=val;}}void del(int n,int x){for(int i=x;i<=n;i+=lowbit(i)){c[i]=0;}}int getsum(int x){int ans=0;for(int i=x;i>=1;i-=lowbit(i)){ans+=c[i];}return ans;}
}T[3];
void solve(int l,int r)
{if(l==r){ans++;return;}int mid=(l+r)/2,suf_max=0,suf_min=0x7f7f7f7f;pre_max[mid+1]=pre_min[mid+1]=a[mid+1];for(int i=mid+2;i<=r;i++){pre_max[i]=max(pre_max[i-1],a[i]);  pre_min[i]=min(pre_min[i-1],a[i]);}for(int i=mid+1;i<=r;i++)  T[0].add(500000,pre_max[i]-pre_min[i]-i+300000,1);for(int i=mid,k1=mid,k2=mid;i>=l;i--){suf_max=max(suf_max,a[i]);  suf_min=min(suf_min,a[i]);while(k1+1<=r&&suf_max>=pre_max[k1+1]&&suf_min<=pre_min[k1+1]){k1++;T[1].add(500000,pre_max[k1]-k1+300000,-1);T[2].add(500000,-k1-pre_min[k1]+300000,-1);}while(k2+1<=r&&(suf_max>=pre_max[k2+1]||suf_min<=pre_min[k2+1])){k2++;T[0].add(500000,pre_max[k2]-pre_min[k2]-k2+300000,-1);T[1].add(500000,pre_max[k2]-k2+300000,1);T[2].add(500000,-k2-pre_min[k2]+300000,1);}ans+=max(0,k1-max(mid+1,suf_max-suf_min-m+i)+1);ans+=T[0].getsum(m-i+300000);ans+=(suf_min<=pre_min[k2])?T[1].getsum(suf_min-i+m+300000):T[2].getsum(-suf_max-i+m+300000);}for(int i=mid+1;i<=r;i++)  T[0].del(500000,pre_max[i]-pre_min[i]-i+300000);for(int i=mid+1;i<=r;i++)  T[1].del(500000,pre_max[i]-i+300000);for(int i=mid+1;i<=r;i++)  T[2].del(500000,-i-pre_min[i]+300000);solve(l,mid);solve(mid+1,r);
}
int main()
{
// #define Isaac
#ifdef Isaacfreopen("in.in","r",stdin);freopen("out.out","w",stdout);
#endifcin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}solve(1,n);cout<<ans<<endl;return 0;
}

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

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

相关文章

iterm2

外观 这个github上的项目提供了很多主题 https://iterm2colorschemes.com/ 亮色主题感觉还可以的几个: OneHalfLight、BuiltinLight、BlulocoLight、Materil、ProLight、Tango Half Adapted 下面截图是基于 Tango Half Adapted用蓝色代替青色,黄色加深之后的效果(vim括号插件…

22. MDI窗口设计

一、什么是MDI窗口MDI 窗口(Multiple-Document Interface),又称多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗口中通常包含子菜单和窗口菜单,用于在窗口或文档之间进行切换。用 QMainWindow 建立的主界面,通常会同时建立或打开多个相互独立…

详解:订单履约系统规划

大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。 通过订单履约系统,消费者可以实时了解商品的物流状态和预…

文件单独编译生成

编译设备树也最好在 source过的那个窗口中来编译错误提示如下: 同时在makefile文件修改时也要注意

In‐band Network Telemetry

#卫星 #遥测技术 #INT 一、INT是什么? INT,In‐band Network Telemetry ,带内网络遥监测。telemetry,英文原意是遥测技术。从其英文名称可以了解如下: a.In-band,说明监测指令及数据均在带内传输 b.telemetry ,说明是长距离,远程获取网络数据的方法。 想象一下卫星在…

潮汐指纹识别工具 : 在线网站识别利器

最近发现了一个免费在线收集网站信息的工具,感觉挺好用的,给各位推荐下。潮汐在线指纹识别是山东新潮信息技术有限公司安全团队提供的一个免费开源在线网站信息收集工具。 功能亮点: 全面扫描 只需输入目标网站的URL或IP地址,即可获取该网站的标题、中间件、操作系统、域名…

JAVA-Day 11:数组的静态初始化和遍历

数组的静态初始化和遍历 数组静态初始化格式 数组的静态初始化与遍历 完整格式:数据类型 [] 数组名=new 数据类型[]{元素1,元素2,元素3,....} 简化格式:数据类型 [] 数组名={元素1,元素2,元素3,....} []在数组名前后都可以 代码如下: int number[]={1,2,3,4,5};for (int …

JAVA-Day 10:Do...While循环语句

Do...While循环语句 Do...While循环格式 初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句); 例: 使用do...while循环输出1-10的和(包括10) int i=1;int count=0;do{count+=i;i++;}while(i<=10);System.out.println(count);代码运行结果如下图所示:

配置tigerVNC,登陆远程服务器

1.在远程服务器安装、配置 (1) sudo apt update sudo apt install xfce4 xfce4-goodies (2) 安装TigerVNC sudo apt install tigervnc-standalone-server (3) 配置vnc vncpasswd (4) 配置.vnc: vim ~/.vnc/xstartup 添加:cat .vnc/xstartup#!/bin/sh # 启动 D-Bus 会话 (如果未…

CF1993F2 Dyn-scripted Robot (Hard Version)

Dyn-scripted Robot (Hard Version) 题目链接。 Problem Easy Version:\(K \le n\)。 Hard Version:\(K \le 10^{12}\)。 一个 \(Oxy\) 平面上有一个 \(w \times h\) 矩形,矩形的左下方有点 \((0, 0)\) ,右上方有点 \((w, h)\) 。 您还有一个最初位于点 \((0, 0)\) 的机器人…

OmniNxt 论文阅读

来源: https://arxiv.org/html/2403.20085?_immersive_translate_auto_translate=1 标题: OmniNxt: A Fully Open-source and Compact Aerial Robot with Omnidirectional Visual Perception OmniNxt 感觉是, 取自 Omnidirectional 中 全的意思, Nxt 像是 Next 的意思,表…

2024-12-1-#{}与¥{}的区别-response

{}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应