HH 的项链

news/2024/9/19 17:05:24/文章来源:https://www.cnblogs.com/Hanggoash/p/18416533

HH的项链 题解

题意

给定一个序列 \(a_N\) ,有 \(m\) 个询问 \([l,r]\) ,问在该区间中不同数的数量有多少。该题目可以和 ABC371E 对比着做。

思路

\(N\in[1,10^6]\) ,暴力枚举是 \(n^2\) 的会超时。

但是我们先假定这 \(n\) 个数字本就两两不同,那么他们各自都会产生 \(1\) 的贡献,如果每个数相应的位置都代表数值 \(1\) ,那么就是在查询 \(sum[r]-sum[l-1]\) 而已。

事实上上述假设并不能一定成立。

那么有一种和莫队和相似的巧妙算法就是先离线,然后再考虑区间之间移动时的增量。

核心

我们先按照右区间升序排序。

言下之意就是如果有 \(114514\)\(3\) ,那你也只能算一种。我们保留刚刚的前缀和算法,钦定所有相同数字 \(x\) 所产生的贡献 \(1\) 都在当前最右边的 \(x\) 身上,其余的 \(x\) 贡献都为 \(0\),并且随着我们枚举区间不断更新这个"最右"的位置,这时候我们发现了按照右区间升序排序的优越性。

那就是下一个枚举到的区间要不就不包含 \(x\) 这个数字 ,要么就一定至少包含最右边的 \(x\) (可能同时包含左边的 \(x\) ),由于 \(r\) 是逐渐增大的,所以我们不可能枚举到一个包含左边 \(x\) 们,但又不包含最右边 \(x\) 的区间。因此我们就成功统计了 \(x\) 对当前区间 (如果有的话)的贡献。

所以对于一个 \([l,r]\) ,我们先做好从上一个 \(r_{las}\) 到这一个 \(r_{now}\) 的更新,再直接统计答案 \(sum[r]-sum[l-1]\) 就好了。

由于是单点修改并且多次查询,就选择树状数组了。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{x=0;int f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x*=f;
}
template<typename T>inline void wr(T x)
{if(x<0)putchar('-'),x=-x;if(x>9)wr(x/10);putchar(x%10^48);
}
const int N=1e6+5;
int v[N],c[N],n,m;
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int v)
{for(;x<=n;x+=lowbit(x))c[x]+=v;
}
inline int query(int x){int ans=0;for(;x>=1;x-=lowbit(x))ans+=c[x];return ans;}
struct Q
{int l,r,idx;
}a[N];
int ans[N];
bool cmp(Q a,Q b){return a.r==b.r?a.l>b.l:a.r<b.r;}
inline void pre()
{re(n);for(register int i=1;i<=n;++i)re(v[i]);re(m);for(register int i=1;i<=m;++i){re(a[i].l),re(a[i].r);a[i].idx=i;}sort(a+1,a+m+1,cmp);
}
int las[N];
inline void solve()
{int st=1;for(int i=1;i<=m;++i){for(;st<=a[i].r;++st){if(las[v[st]])add(las[v[st]],-1);add(st,1);	las[v[st]]=st;}ans[a[i].idx]=query(a[i].r)-query(a[i].l-1);}
}
int main()
{pre();solve();for(register int i=1;i<=m;++i)wr(ans[i]),putchar('\n');return 0;
}

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

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

相关文章

本地文件包含漏洞详解与CTF实战

1. 本地文件包含简介 1.1 本地文件包含定义 本地文件包含是一种Web应用程序漏洞,攻击者通过操控文件路径参数,使得服务器端包含了非预期的文件,从而可能导致敏感信息泄露。 常见的攻击方式包括:包含配置文件、日志文件等敏感信息文件,导致信息泄露。 包含某些可执行文件或…

代码随想录算法 - 二叉树6

题目1235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…

6、函数的声明

程序是一行行执行,我们可以在前面进行函数声明,然后将函数的定义放在程序末尾。 声明可以写多次,但是定义只能写一次。

如何基于Java解析国密数字证书

一、说明 随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,一、说明 随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛。然而,在…

Windows应急响应-个人整理

个人总览-仍待完善Windows应急响应整理(一)参考 1.NOPTeam的手册链接 2.fox-yu的博客(思路很清晰,对我这个小白来说很友好)1.整体思路 1.1常见事件类型(不完整、待补充)网络协议攻击:拒绝服务攻击:DDos、CC攻击、泛洪攻击等。链接 DNS劫持 ARP欺骗web入侵:webshell 网页挂马…

视野修炼-技术周刊第101期 | 垂直居中

① align-content - 垂直居中普通元素 ② up mode - 一键隐藏 Chrome 插件 ③ Chrome 性能面板新功能 ④ k-colors.js - 图片主色提取 ⑤ 英:优化JS性能的一些技巧 ⑥ 英:Web 的剪贴板,如何存储不同类型的数据 ⑦ 英:不简单的 js 入门教程 ⑧ Peter Cat - GitHub 仓库智能答…

06: 抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类1. 案例 在Access和SQL server分别插入User表和Department表 2. 抽象工厂模式结构 - 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法struct User {std::string m_sName = "";…

南沙C++信奥老师解一本通题 1371:看病

​【题目描述】有个朋友在医院工作,想请BSNY帮忙做个登记系统。具体是这样的,最近来医院看病的人越来越多了,因此很多人要排队,只有当空闲时放一批病人看病。但医院的排队不同其他排队,因为多数情况下,需要病情严重的人优先看病,所以希望BSNY设计系统时,以病情的严重情…

堪称最优秀的 Docker 可视化管理工具 ——Portainer

Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理 Docker 环境,包括单机环境和集群环境。随着 Docker 内实例越来越多,就得涉及到监控以及统计的需求:有多少个容器?运行的有几个?有哪些容器 CPU 使用率低?... Portainer 是一款轻量级的应用,它提供了图…

分布式数据库中间件:MyCat 和 ShardingSphere

分布式数据库中间件 用于实现 分库、分表、分片、分布式事务、读写分离 等。 本文 是 调查 MyCat 和 ShardingSphere 两款 中间件 的一些信息汇总。本文时间:2024年9月。MyCat Mycat数据库分库分表中间件。ben发布于博客园 http://www.mycat.org.cn github-Mycat1 https://gi…

Python 遭遇 ProxyError 问题记录

本内容复制知乎的一个贴子,在此只做下记录及参考和学习,原链接地址: 最近遇到的一个问题,在搞清楚之后才发现这么多年的 HTTPS_PROXY 都配置错了! 起因 想用 Python 在网上下载一些图片素材,结果 requests 报 requests.exceptions.ProxyError,具体的错误信息见下面。当然…

白云龙期货投资-第二讲

K线图基本用途就是为了寻找“买卖点”,所有的进场点有K线配合能大大的提高进场的成功率。关键点位出现K线及组合配合。大胆进场(波浪理论第五浪。回调黄金分割率点,趋势线,颈线,整数关口等)。K线技术-一切技术之根本 K线图基本用途就是为了寻找“买卖点”,所有的进场点有K…