P5070 [Ynoi Easy Round 2015] 即便看不到未来 做题记录

news/2025/3/28 15:46:56/文章来源:https://www.cnblogs.com/XP3301Pipi/p/18785799

P5070 [Ynoi Easy Round 2015] 即便看不到未来

Description

对于一个序列 \(A\),将其去重排序,得到序列 \(B\)

  • 对于一个二元组 \((l,r) \ (l\leq r)\),称其长度为 \(r-l+1\)

  • 对于一个二元组 \((l,r)\),满足对于任意的 \(l<i\leq r\) 的整数 \(i\),都有 \(B_i=B_{i-1}+1\),则称 \((l,r)\) 是一个值域连续段。

  • 对于一个二元组 \((l,r)\),满足其是一个值域连续段,且 \((l-1,r),(l,r+1)\) 都不是,则称 \((l,r)\) 是一个极长值域连续段。

给定序列 \(A\)\(Q\) 次询问。每次询问给出 \(L,R\),输出 \(A[L,R]\) 中长度分别为 \(1,2,3,\cdots,10\) 的极长值域连续段个数。

\(1\leq n,Q,A_i\leq 10^6\)

Solution

首先将询问全部离线,挂在右端点上。考虑扫描线,我们推进右端点 \(r\),维护 \([i,r]\) 的答案。

接下来就要考虑右端点从 \(r-1\) 推进到 \(r\),对答案的贡献是什么。也就是加入 \(A_r\) 这个数字,会对这些值域连续段造成什么影响。

\(lst_x\)\(A[1,r-1]\)\(x\) 这个数字最后一次出现的位置。插入 \(A_r\) 后,只有 \(A[lst_{A_r},r]\) 这一部分的值域有变化,也就只需要维护这一部分的答案。

首先题目要求的连续段长度比较小,我们只需要考虑 \([A_r-k,A_r+k]\) 中的数字。

我们把这些数字 \(x\) 和它们的 \(lst_x\) 放入数组 \(pos\) 中,按照 \(lst\) 从大到小排序。当然,要满足 \(lst_x>lst_{A_r}\)

遍历 \(pos\)。在遍历的过程中,我们维护一个 \(vl,vr\),表示目前包含 \(A_r\) 这个数字的极长值域连续段是什么。

每枚举一个 \(pos_i\),我们就维护出新的 \(vl,vr\)。对于区间 \([pos_{i+1}+1,pos_i]\)\((vl,A_r-1)\)\((A_r+1,vr)\) 这两个连续段被 \(A_r\) 接起来,变为新的极长连续段 \((vl,vr)\)

我们维护出 \(c_{i,j}\),表示 \(A[i,r]\) 中长度为 \(j\) 的极长连续段的数量。我们需要支持区间加,单点查,对于每一个长度分别用一棵树状数组维护即可。

还有一个细节:\(k\) 具体取多少?

首先对于 \(A_r\),其所在的连续段内的数字一定都在 \([A_r-9,A_r+9]\) 内,那么 \(k\) 至少要取 \(9\)

如果一个极长连续段为 \((A_r-10,A_r-1)\) 或者 \((A_r+1,A_r+10)\),加入 \(A_r\) 后,我们需要把它们的贡献删去。那么 \(k\) 至少要取 \(10\)

但是还不够。我们需要删去长度 恰好\(10\) 的值域连续段,长度大于 \(10\) 的连续段一定在前面的 \(r'\) 中被删去了。所以我们的 \(k\) 需要取到 \(11\),来判断这些连续段长度是否恰好为 \(10\)

时间复杂度为 \(O(nk \log n)\),可以通过。

int n,m,Q,a[N],lst[N],ans[N][13];
bool vis[N];struct Query{int x,id;
};
vector<Query> q[N];struct Fenwick{int tr[N];void Update(int x,int v){for(;x<=n;x+=x&-x) tr[x]+=v;}void Update(int l,int r,int v){Update(l,v);Update(r+1,-v);}int Ask(int x){int res=0;for(;x;x-=x&-x) res+=tr[x];return res;}int Ask(int l,int r){return Ask(r)-Ask(l-1);}
}Bit[12];struct Node{int x,p;bool operator<(const Node& tmp)const{return p>tmp.p;}
};
vector<Node> s;signed main(){read(n),read(Q);for(int i=1;i<=n;i++){read(a[i]);Ckmax(m,a[i]);}for(int i=1;i<=Q;i++){int l,r;read(l),read(r);q[r].push_back({l,i});}for(int i=1;i<=n;i++){s.clear();s.push_back({a[i],i});int VL=max(1,a[i]-11),VR=min(m,a[i]+11);for(int j=VL;j<=VR;j++){vis[j]=0;if(lst[j]>lst[a[i]])s.push_back({j,lst[j]});}s.push_back({a[i],lst[a[i]]});sort(s.begin(),s.end());vis[a[i]]=1;int L=a[i],R=a[i];for(int j=0;j<(signed)s.size()-1;j++){vis[s[j].x]=1;while(L>VL&&vis[L-1]) L--;while(R<VR&&vis[R+1]) R++;Bit[a[i]-L].Update(s[j+1].p+1,s[j].p,-1);Bit[R-a[i]].Update(s[j+1].p+1,s[j].p,-1);if(R-L+1<=10) Bit[R-L+1].Update(s[j+1].p+1,s[j].p,1);}for(Query j:q[i])for(int k=1;k<=10;k++)ans[j.id][k]=Bit[k].Ask(j.x);lst[a[i]]=i;}for(int i=1;i<=Q;i++){for(int j=1;j<=10;j++) putchar(ans[i][j]%10+'0');puts("");}return 0;
}

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

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

相关文章

C语言程序实验二

实验任务1:#include <stdio.h> #include <stdlib.h> #include <time.h>#define N 5int main() {int number;int i;srand(time(0));for(i = 0; i<N; ++i){number = rand()%100 +1;printf("20490042%04d\n", number);}return 0;} 问题1:生成一…

智慧工地合规穿戴监测系统

智慧工地合规穿戴监测系统基于计算机视觉的未佩戴安全帽检测算法通过实时视频流分析,可突破人工监管的物理局限,实现724小时全场景覆盖。该技术通过深度学习模型对人体姿态、头部特征进行精准识别,快速定位违规行为,为安全监管提供数据化、智能化的升级路径。核心算法模型采…

停车场立体车库人员滞留报警系统

停车场立体车库人员滞留报警系统采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确的对场景中发生的人员入侵行为发出告警信息。通过对实时视频图像进行智能分析识别,可实现图像全屏周界防护、划定区域周界防护等功能。前端智能AI预警摄像机设备嵌入AI…

解决:按钮被禁用--Popconfirm 气泡确认框仍然可以弹出来展示

按钮被禁用,仍然可以点击,并弹出提示框 <template><a-popconfirmtitle="Are you sure delete this task?"ok-text="Yes"cancel-text="No"@confirm="confirm"@cancel="cancel"> <!-- 按钮被禁用 -->&l…

服务器发送事件(SSE)在现代Web开发中的关键作用

在快速发展的Web开发领域,采用能够增强用户体验并简化数据流的前沿技术对开发者至关重要。服务器发送事件(SSE)正是其中的一项技术。本指南旨在介绍SSE的概念、关键特性、常见应用场景、一个实际的实现示例,并讲解如何使用Apipost调试这些事件。 什么是SSE? 服务器发送事件…

人员非法进入货梯监控报警摄像头

人员非法进入货梯监控报警摄像头对于厂区车间货梯轿厢有人闯入,有很好的预防效果。现场曾发生过货梯运行有员工误进的事件,对安全监控造成严重威胁,对该位置进行实时监控较为重要。货梯监测人员报警摄像机是嵌入AI人体识别算法,对人体的精确检测、跟踪,实现对人体检测分析…

Apifox 与 Apipost 接口状态自定义功能对比:企业级项目的接口管理优化

在现代企业级项目开发中,接口状态管理不仅仅是项目开发中的一个小模块,而是影响团队协作效率、项目推进进度和合规性的重要因素。特别是在中大型项目中,由于涉及多个协作部门与复杂的业务流程,对接口状态的定义和流转有着更高的灵活性要求。然而,不同工具在接口状态管理功…

Windows 提权-服务_弱注册表权限

本文通过 Google 翻译 Weak Registry Key Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 搜寻服务的弱权限注册表项1.1 枚举弱权限注册表项:accesschk.exe 1.2 枚举弱权限注册…

【每日一题】20250321

人嘛,反正就是这样。表面上做的跟心里想的,完全是两码事。表里不一,这很正常。【每日一题】 1.(14分) \(\hspace{0.7cm}\)如图所示的平面直角坐标系 \(xOy\),在第 \(\mathrm{I}\) 象限内有平行于 \(y\) 轴的匀强电场,方向沿 \(y\) 轴正方向;在第 \(\mathrm{IV}\) 象限的…

2025最新面试题-场景面试题MQ

RabbitMQ的消息处理模型 RabbitMQ的消息处理模型RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的消息队列系统生产者(Producer)交换器(Exchange)路由键(Routing Key)队列(Queue)消费者(Consumer)生产者(Producer)生产者是消息的发送者,负责…

day:26 selenium——滚动条、key类

一.滚动条 代码:window.scrollTo(0,2000) from selenium import webdriver #导入selenium模块中的webdriver from selenium.webdriver.support.select import Select import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.jd.c…

day:27 unittest实战梳理

一.将cms写入到unittest框架中 1.main调用所有用例import unittest from selenium import webdriver from time import * class Cms(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:pass@classmethoddef tearDownClass(cls) -> None:passdef s…