P10833 [COTS 2023] 下 Niz

题目大意

详细题目传送门
给出 \(n\)\(a_1\cdots a_n\),求有多少个区间 \([l,r]\) 满足 \(a_l\cdots a_r\)\(1\)\(r-l+1\) 的排列。
\(a_i\leq n\leq10^6\)

思路

对于 \([l,r]\),要满足

  1. \(\max_{i=l}^r a_i=r-l+1\)
  2. \(\forall i,j,a_i\neq a_j\)

可以猜到真正符合条件的区间应该不会很多,又因为区间一定要有且仅有一个 \(1\),所以可以和 \(1\) 的位置考虑。先考虑一个位置 \(i\) 作为区间端点的情况,所以维护对于一个位置 \(i\) 上一个 \(1\) 和下一个 的位置 \(p_i,n_i\)。发现只考虑 \((i,i+\max_{j=i}^{n_i}a_j-1)\)\((i-\max_{j=p_i}^i a_j+1,i)\) 即可。首先这个肯定是对的,但是为什么不会少呢?是因为对于再前面或后面的,如果还有最大值会被前面的左端点也算上,所以不会算漏只会算重。所以现在有不超过 \(2n\) 个区间需要判断第 \(2\) 个条件。

对于这一个条件,一般做数据结构题做多了就会想到就是求 \(\mathrm{mex}(a_l\cdots a_r)\overset{?}{=} r-l+2\)

区间 \(\mathrm{mex}\) 是不好求的,但是考虑到我们只有 \(2n\) 个区间,所以考虑离线后排序。前缀 \(\mathrm{mex}\) 相对好求,现在考虑如果把 \(a_l\) 删去带来的影响。发现就是可以在下一个 \(a_l\) 之前使用。所以也就是对于 \(m_i\) 表示 \(\mathrm{mex}\in[l,i]\)。我们可以找到 \(f_i\) 表示下一个 \(a_i\) 的位置。于是对于每一次 \(a_l\) 的删除操作,我们可以将 \(m_i\leftarrow \min(m_i,a_l),i\in[l+1,f_l-1]\)。对于一个 \([l,r]\) 判断 \(m_r\overset{?}{=}r-l+2\) 即可。

时间复杂度 \(O(n\log n)\)

代码

#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);++i)
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5;
ll n,a[MAXN];
ll st[MAXN][22],lg[MAXN+5];
ll qm(ll l,ll r){ll len=lg[r-l+1];return max(st[l][len],st[r-(1<<len)+1][len]);
}
ll lst[MAXN],pre[MAXN];
struct Qj{ll l,r;bool operator<(const Qj&K)const{if(l==K.l){return r<K.r;}return l<K.l;}
};
vector<Qj>V,v;
struct node{ll u,x,tag;#define lc(u) (u<<1)#define rc(u) (u<<1|1)
}t[MAXN*4];
void push_down(ll u){t[lc(u)].tag=min(t[lc(u)].tag,t[u].tag);t[rc(u)].tag=min(t[rc(u)].tag,t[u].tag);t[lc(u)].x=min(t[lc(u)].x,t[u].tag);t[rc(u)].x=min(t[rc(u)].x,t[u].tag);t[u].tag=1e18;
}
ll mex[MAXN];
void build(ll u,ll l,ll r){t[u].tag=1e18;if(l==r){t[u].x=mex[l];return;}ll mid=(l+r)>>1;build(lc(u),l,mid);build(rc(u),mid+1,r);
}
void modify(ll u,ll l,ll r,ll ql,ll qr,ll x){if(ql<=l&&r<=qr){t[u].tag=min(t[u].tag,x);t[u].x=min(t[u].x,x);return;}push_down(u);ll mid=(l+r)>>1;if(ql<=mid){modify(lc(u),l,mid,ql,qr,x);}if(mid+1<=qr){modify(rc(u),mid+1,r,ql,qr,x);}
}
ll nxt[MAXN],vs[MAXN];
ll query(ll u,ll l,ll r,ll x){if(l==r){return t[u].x;}push_down(u);ll mid=(l+r)>>1;if(x<=mid){return query(lc(u),l,mid,x);}return query(rc(u),mid+1,r,x);
}
bool vv[MAXN];
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;rep(i,2,n+5){lg[i]=lg[i/2]+1;};rep(i,1,n){cin>>a[i];if(a[i]==1){lst[i]=i;}else{lst[i]=lst[i-1];}st[i][0]=a[i];};for(int i=n;i>=1;--i){nxt[i]=vs[a[i]];if(nxt[i]==0){nxt[i]=n+1;}vs[a[i]]=i;if(a[i]==1){pre[i]=i;}else{pre[i]=pre[i+1];}}rep(j,1,lg[n]){for(int i=1;i+(1<<j)-1<=n;++i){st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);}};rep(i,1,n){if(lst[i]){ll l=i-qm(lst[i],i)+1,r=i;if(l>=1){V.push_back({l,r});}}if(pre[i]){ll r=i+qm(i,pre[i])-1,l=i;if(r<=n){V.push_back({l,r});}}};if(V.empty()){cout<<0<<endl;return 0;}sort(V.begin(),V.end());v.push_back(V[0]);rep(i,1,ll(V.size()-1)){if(V[i].l==V[i-1].l&&V[i].r==V[i-1].r){continue;}v.push_back(V[i]);};vv[0]=true;rep(i,1,n){mex[i]=mex[i-1];vv[a[i]]=true;while(vv[mex[i]]){mex[i]++;}};build(1,1,n);ll tot=0,ans=0;rep(i,1,n){while(tot<ll(v.size())&&v[tot].l==i){ll l=v[tot].l,r=v[tot].r,val=query(1,1,n,r);if(val==r-l+2){ans++;}tot++;}modify(1,1,n,i+1,nxt[i]-1,a[i]);};cout<<ans<<endl;return 0;
}

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

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

相关文章

9图看2025中国新质生产力发展举措

发展新质生产力,政府工作报告这样说: ①推动商业航天、低空经济等新兴产业安全健康发展 ②培育生物制造、量子科技、具身智能、6G等未来产业 ③促进专精特新中小企业发展壮大,支持独角兽企业、瞪羚企业发展 ④支持大模型广泛应用 ⑤大力发展智能网联新能源汽车、人工智能手机…

manim边学边做--三维图形的场景类

在Manim中,ThreeDScene是一个专门为三维场景设计的类。 它通过配置三维相机、支持复杂的相机运动以及管理物体与相机的交互关系,为科学可视化、工程仿真、数学教育等领域提供了强大的工具。 典型应用场景包括:三维几何图形的动态演示(如旋转立方体、莫比乌斯环) 物理过程的…

第三章 准确估算的价值

3.1 高估更好还是低估更好 3.1.1 反对高估的观点 管理人员和其他项目干系人有时会担心,如果项目被高估了,帕金森法则就会起作用——也就是所有可以用来完成工作的时间都会被浪费掉。因此,为了避免帕金森法则,某些管理人员会有意识地 "压缩" 这估算值。 另一个顾虑…

Windows中conda的安装与使用

下载安装miniconda 说明: Miniconda是一款管理python环境的软件工具 第一步:下载miniconda 代码如下: win+r后,输入cmd指令按回车 在终端中输入: curl https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_4.12.0-Windows-x86_64.exe --output 按照…

CHT 另解

引入 CHT 又叫 凸包优化,是一种利用一次函数(斜率)来优化 Dp 的一种方法。 它的独特之处在于,传统斜率优化依靠的是一个一个的点,而凸包优化是利用一条条直线来优化,省去了一些码量。 我们用一道例题引入。 例1 HDU-3480 Dp 暴力 Link 题目是说,将 \(n\) 个数划分到 \(m…

PHP 发送电子邮件 功能 用法运用 详解

PHP发送电子邮件功能、用法及运用详解 一、PHP发送电子邮件的基本概述 PHP提供了多种方式来发送电子邮件,其中最常用的方法是使用内置的mail()函数或通过SMTP(Simple Mail Transfer Protocol)协议。随着技术的发展,许多开发者更倾向于使用第三方库(如PHPMailer)来增强邮件…

Linux 离线安装 zstd

前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行。1、检查前置依赖组件在安装 zstd 之前,需要确认已安装了相关依赖组件: gcc 。 rpm -qa | grep gcc前置依赖组件的具体离线安装方法请参考:CentOS-7离线安装gcc 2、下载zstd安装包 官方…

HarmonyOS Next开发教程之地图定位

今天分享一下在鸿蒙开发中的地图定位问题,也就是在地图中如何定位自己所在的位置。 关于如何加载显示地图在之前的文章已经详细介绍过,有问题的友友可以点击查看: HarmonyOS NEXT实战教程-实现Keep运动轨迹 将地图定位到自己所在的位置,有几种方法: 一种是在初始化地图前先…

HarmonyOS Next实战教程:实现中间凹陷的异形tabbar

今天要和大家分享的实战案例是实现中间凹陷的tabar前些天在做墨迹天气的时候看到了这种异形的tabbar,看起来比较有挑战性,因为鸿蒙版的墨迹天气app还没有这个东西,我决定尝试做一下。 系统的Tabs肯定是不行了,我们需要自定义。 难度直接拉满,直接做最难的部分,就是这个中…

HarmonyOS NEXT实战:高仿墨迹天气开发手记(附源码)

老余说3月份的神秘产品是为纯血鸿蒙而生的一款全新形态的手机,别人想象不到的手机产品,这次的保密工作真是非常到位,让人十分期待。 闲言少叙,今天为大家分享新年的第一个实战项目,高仿墨迹天气 这个项目中有一些复杂的动效和曲线,对于新手友友来说可能会有一点难,不过没…

VSCode + CMake + MinGW 在 Windows 下的简易调试指南

VSCode + CMake + MinGW 在 Windows 下的简易调试指南 目录VSCode + CMake + MinGW 在 Windows 下的简易调试指南准备工作下载VSCode下载CMake下载MinGW待编译源码VSCode调试task.json 配置launch.json 配置开始调试鉴于网络上关于VSCode的调试的教程不多,并且掺杂着大量的随机…

指令集并行与开发进阶算法

进阶算法 基础算法无法解决中断恢复的问题,即假如有两个写寄存器的操作,指令1,指令2,可能乱序执行时指令2的结果已经将写回了寄存器,但是指令1还未执行,此时发生中断后,从指令1重新开始执行,就会重新进行两次写入,将会发生错误。 只要保证后面指令修改机器状态时, 前面…