首页 > 其他分享 >树状数组-类 HH 的项链类型题目总结

树状数组-类 HH 的项链类型题目总结

时间:2025-01-23 19:42:33浏览次数:1  
标签:树状 询问 位置 贡献 HH 数组 项链 维护

前言

感觉 HH 的项链这道题的思路具有启发性,故记录在此。

题目

对于一个序列 \(a\),给定 \(m\) 次询问,每次询问求 \([l,r]\) 内有多少个数,相同的数只记一次。

对于样例:

1 2 3 4 3 5

很显然,如果我们询问区间满足 \(3\le l\le r\le 5\),则对于 \(3\) 这个数,有用的贡献仅有第 \(5\) 位。

所以我们可以将询问的区间按照右端点排序,从左向右处理序列 \(a\),当处理到第 \(i\) 位时,我们回答所有右端点为 \(i\) 的询问。

然后我们便可以维护一个树状数组,维护的信息是当前有多少个位置产生着贡献,值为 \(1\)。当我们处理到 \(i\) 位时,\([1,i]\) 的和即为现在不同的数的个数。

至于怎么维护,我们注意到值域为 \([1,10^6]\),因此直接开一个数组对每个数维护上一次出现的位置,当这个数再次出现时把上一次出现位置 \(-1\),把当前位置 \(+1\) 再回答询问。

代码主要部分:

	int j = 0;
	for (int i = 1; i <= m; i++) {
		if (z[i].r != j) {
			for (int k = j + 1; k <= z[i].r; k++) {
				if (pos[a[k]]) {
					modify(pos[a[k]],-1);
					modify(k,1);
					pos[a[k]] = k;
				}else{
					modify(k,1);
					pos[a[k]] = k;
				}
			}
			j = z[i].r;
		}
		z[i].ans = query(z[i].r) - query(z[i].l-1);
	}

类似题目

P4113 [HEOI2012] 采花

一句话:用两个树状数组分别维护倒一次和倒二次出现的位置有无贡献。

与上一题不同之处仅在于要求区间内每个数至少出现 \(2\) 次,因此我们维护两个树状数组和两个存放最后一次或倒数第二次出现下标的数组。当一个数出现第 \(2\) 次或更多时,将第一个树状数组该数最后出现的位置 \(+1\),第二个树状数组该数倒数第二次出现的位置 \(+1\)。如果位置更新,取消原贡献再加上新贡献。

为什么维护了两个树状数组?因为如果一个数在树状数组两个位置都有 \(1\) 的贡献,则最后询问会导致重复。

其实也可以只用一个,但是我当时没想出来

标签:树状,询问,位置,贡献,HH,数组,项链,维护
From: https://www.cnblogs.com/bbbbeta/p/18688556

相关文章

  • 树状数组
    Question01[P3374树状数组一]模板题Code#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+7;classTree{ public: inlinevoidscan(longlong*_data,int_size){ size=_size; for(inti=1;i<=size;i++)_data[i]+=_data[i-1]; for(inti......
  • 树状数组
    l(x)=x-lowbit(x)+1。即,l(x)是c[x]管辖范围的左端点。对于任意正整数x,总能将x表示成s*2^{k+1}+2^k的形式,其中lowbit(x)=2^k。下面「c[x]和c[y]不交」指c[x]的管辖范围和c[y]的管辖范围不相交,即[l(x),x]和[l(y),y]不相交。「c[x]包含于c[y]」......
  • 树状数组板子(单点增加+范围查询)
    用于解决范围数字和与单点增加问题(复杂度O(logn))build方法(构造树状数组)voidbuild(){ for(inti=1,v;i<=n;i++){ cin>>v; add(i,v); }}lowbit方法(获取一个二进制数最低位的1的状态)intlowbit(intx){ returnx&(-x);}add方法(单点增加)voidadd(inti,int......
  • 代码随想录——动态规划31打家劫舍III(树状DP)
    这道题目是打家劫舍III(HouseRobberIII),是打家劫舍系列问题的变种。问题描述如下:小偷发现了一个新的区域,这个区域的所有房屋排列类似于一棵二叉树。如果两个直接相连的房屋在同一晚被打劫,房屋会自动报警。给定这棵二叉树的根节点root,求在不触发警报的情况下,小偷能够盗取的最......
  • [SDOI2009] HH去散步
    传送门题目分析首先观察数据范围\(N\le50\),\(M\le60\),\(t\le2^{30}\)\(N,M\)很小,但\(t\)很大,不足以支持依赖于\(t\)的动态规划,那就要向其他方向去思考。对于这类定长路径且支持邻接矩阵的图论,我们有一个很好用的结论兼工具——矩阵乘法。对于一个邻接矩阵进行\(k\)次乘......
  • sqoop export报错Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
    sqoopexport报错Timestampformatmustbeyyyy-mm-ddhh:mm:ss[.fffffffff]sqoopexport报错如下:Causedby:java.lang.IllegalArgumentException:Timestampformatmustbeyyyy-mm-ddhh:mm:ss[.fffffffff]atjava.sql.Timestamp.valueOf(Timestamp.java:204)atGS......
  • R语言ggplot2可视化树状图、层次聚类系统树图、树状图根据给定的距离度量将相似点分组
    R语言ggplot2可视化树状图、层次聚类系统树图、树状图根据给定的距离度量将相似点分组在一起、并根据点的相似性将它们组织成树状图链接起来(HierarchicalDendrogram)目录R语言ggplot2可视化树状图、层次聚类系统树图、树状图根据给定的距离度量将相似点分组在一起、并根据点......
  • 树状数组【单点修改+区间查询】+二分
    https://codeforces.com/gym/580226/problem/H#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#definelowbit(x)x&(-x)usingll=longlong;usingpii=pair<int,int>;constdoublePI=acos(-1);constintN=2e5......
  • 树状数组【区间修改+单点查询】
    https://www.luogu.com.cn/problem/P3368#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#definelowbit(x)x&(-x)usingll=longlong;usingpii=pair<int,int>;constdoublePI=acos(-1);constintN=5e5+10......
  • 树状数组【模板】
    https://www.luogu.com.cn/problem/P3374#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#definelowbit(x)x&(-x)usingll=longlong;usingpii=pair<int,int>;constdoublePI=acos(-1);constintN=5e5+10......