Luogu_P1972 HH的项链

HH的项链 (三种解法) (离线查询 + 线段树/树状数组 or 主席树) 题目链接: HH的项链 大致题意 解题思路 离线查询 + 线段树/ 树状数组 or 主席树 解法一: 主席树 主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 看看有多少个不重复的数字. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置有多少个不重复元素. 当加到第index个位置时, 有两种情况: ①该数字在之前没有出现过 ②该数字在之前出现在pos位置过(pos < index). (关于位置pos的维护, 我们可以采用哈希表) 对于情况①, 我 阅读详情

HH的项链

题目链接

Luogu_P1972 HH的项链

题目描述

HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。
有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。

输入格式

一行一个正整数 n n n,表示项链长度。
第二行 n n n个正整数 a i a_i ai​,表示项链中第 i i i个贝壳的种类。
第三行一个整数 m m m,表示 HH 询问的个数。
接下来 m m m行,每行两个整数 l l l, r r r表示询问的区间。

输出格式

输出 m m m行,每行一个整数,依次表示询问对应的答案。

输入输出样例

输入
6
1 2 3 4 3 5
3
1 2
3 5
2 6
输出
2
2
4

说明/提示

【数据范围】

对于20%的数据, 1 ≤ n , m ≤ 5000 1≤n,m≤5000 1≤n,m≤5000;
对于40%的数据, 1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1≤n,m≤105;
对于60%的数据, 1 ≤ n , m ≤ 5 ∗ 1 0 5 1≤n,m≤5*10^5 1≤n,m≤5∗105;
对于100%的数据, 1 ≤ n , m , a i 1 0 6 1≤n,m,a_i 10^6 1≤n,m,ai​106, 1 ≤ l ≤ r ≤ n 1≤l≤r≤n 1≤l≤r≤n。
本题可能需要较快的读入方式,最大数据点读入数据约 20 M B 20MB 20MB。

思路

一开始是把它想成像SSL_2645一样,每一类贝壳是一个“盒子”,最后统计某一段一共有多少个“盒子”。
然后……

5个WA+8个TLE;

在这之后的很长一段时间里,本人百思不得其解,最后,不得不去向大佬们学习了一下。

正确的思路应该是:

  1. 由于相同的数字只被统计1次,所以我只需要标记某个数最后出现的位置就可以了;
  2. 由于询问是无序的,可能会出现询问的区间里明明有某个数,但由于这不是它最后一次出现,因此它没有被统计的情况,所以我要按照每个询问右端点的大小,将每个询问排序;
  3. 对于我当前维护的这一段序列,如果某个数在前边出现过,那么将它前边的位置标记为0,当前的位置标记为1,同时更新整颗线段树;
  4. 最后再统计该询问左右两端点之间1的个数即可;
  5. 实际上本题不需要快读,scanf读入就够了;

代码

#include<algorithm>
#include<cstdio>
using namespace std;
struct str{
	int l,r,v,id;
}tre[4000001],que[1000001];
int n,m,s,st,en;
int a[1000001],pos[1000001],ans[1000001];
void bui(int k,int a,int b)
{
	tre[k].l=a;
	tre[k].r=b;
	if(a==b)
		return;
	int mid=(a+b)/2;
	bui(k*2,a,mid);
	bui(k*2+1,mid+1,b);
}
void add(int k,int i,int num)
{
	if(tre[k].l==tre[k].r)
		tre[k].v=num;
	else
	{
		if(i<=tre[k*2].r)
			add(k*2,i,num);
		else
			add(k*2+1,i,num);
		tre[k].v=tre[k*2].v+tre[k*2+1].v;
	}
}
int sum(int k,int a,int b)
{
	if(tre[k].l==a&&tre[k].r==b)
		return tre[k].v;
	else
	{
		if(b<=tre[k*2].r)
			return sum(k*2,a,b);
		else if(tre[k*2+1].l<=a)
			return sum(k*2+1,a,b);
		else
			return sum(k*2,a,tre[k*2].r)+sum(k*2+1,tre[k*2+1].l,b);
	}
}
bool cmp(str a,str b)
{
	return a.r<b.r;
}
int main()
{
	scanf("%d",&n);
	bui(1,1,n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&que[i].l,&que[i].r);
		que[i].id=i;
	}
	sort(que+1,que+m+1,cmp);//将每个询问按照右端点的由小到大 
	st=1;//本次维护的区间的起点
	for(int i=1;i<=m;i++)
	{
		en=que[i].r;//本次维护的区间的终点
		for(int j=st;j<=en;j++)
		{
			if(pos[a[j]])//如果数字a[j]在前边出现过 
				add(1,pos[a[j]],0);//将a[j]上次出现的位置标记为0
			add(1,j,1);//将a[j]本次出现的位置(即j)标记为1 
			pos[a[j]]=j;//记录下a[j]本次出现的位置
		}
		ans[que[i].id]=sum(1,que[i].l,que[i].r);
		st=que[i].r+1;//下次维护的区间的起点 
	}
	for(int i=1;i<=m;i++)
		printf("%d\n",ans[i]);
	return 0;
}
Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! 目录 Unity 常见问题 之 打包编译的报错 Unable to sign the application; please provide passwords! 一、简单介绍 二、问题描述 三、原因分析 四、可能的解决方法 方法一:取消 Keystore 设置即可 方法二:重新添加 Keystore 相关设置 一... 阅读详情

相关推荐

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

P1972 [SDOI2009] HH的项链 (离线树状数组)

[SDOI2009] HH的项链 - 洛谷 ## 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。 有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。 ## 输入格式 一行一个正整数 $n$,表示项链长度。 第二行 $n$ 个正整数 $...

qq_62539009的博客 501

解密微信DAT图片:一键转换JPG/PNG/GIF的实用指南

本文详细解析微信DAT图片的加密机制及转换方法,提供从定位文件到使用WeijieSoft工具一键转换JPG/PNG/GIF的完整指南。涵盖新旧版微信存储路径差异、批量处理技巧及常见问题解决方案,帮助用户高效恢复重要图片并释放存储空间。

weixin_29305337的博客 3618

HH的项链(莫队/树状数组/主席树)

题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。 有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。 输入格式 一行一个正整数 n,表示项链长度。 第二行 n 个正整数 ai,表示项链中第 i 个贝壳的种类。 第三行一个整数 m,表示 H 询问的个数。 接

qq_35687225的博客 725

WRF所需气象数据的下载方法

#数据下载是个大问题,巧妇难为无米之炊,没有数据就无法模拟啦,疫情期间国外服务器响应慢,打开网页慢都很正常啦~ WRF数据所需要的外部数据分为两种:静态地理数据,grib格式的气象数据(NAM、GFS、RUC、AGRMET等)。静态地理数据可以从WRF官网获得,比较简单,这里不做介绍。所以这篇日志重点介绍的是气象数据的获取。 提前说明,WRF官网不提供气象数据,但WRF官网提供各类气象数据的下载网址链接,所以我们下载一般还是从WRF官网开始。首先进入WRF官网,然后点击WRF ARW Uusres’ .

六出的博客 1万+

从《视觉SLAM十四讲》到项目实战:一文读懂拓扑地图与语义地图为何是服务机器人的未来

本文探讨了服务机器人地图技术的演进,从传统几何地图到拓扑地图与语义地图的跨越。通过分析栅格地图的局限性和拓扑地图、语义地图的优势,揭示了它们在动态开放环境中的智能应用。文章还介绍了多模态语义融合架构和动态语义更新技术,为服务机器人的未来发展提供了技术路线图。

weixin_30292843的博客 478

[SDOI2009]HH的项链

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 HH有一串由各种漂亮的贝壳组成的项链。 HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一 段贝壳,思考它们所表达的含义。 HH不断地收集新的贝壳,因此他的项链变得越来越长。 有一天,他突然提出了一 个问题:某一段贝壳中,包含了多少种不同的贝壳? 这个问题很难回答。。。因为项链实在是太长了。于是,他只 好求助睿智的你,来解决.

eyuhaobanga的博客 407

【软件使用】Calibre部分提参的实战技巧与常见问题解析

本文深入解析Calibre部分提参(Partial Extraction)的实战技巧与常见问题,涵盖PEX、hcell和xcell文件的高级应用。通过实际案例展示如何提升电路仿真效率,解决时钟信号失真等复杂问题,并提供版图设计中的防坑指南,助力芯片设计工程师优化工作流程。

weixin_28717431的博客 162

HH的项链(树状数组)

由于询问的是区间中贝壳的种类数,所以问询区间中相同种类的贝壳只有一个会起作用 将i位置的贝壳前一次出现的位置记作pre[i],种类为x的贝壳最后一次出现的位置记作f[x],类似于邻接表的nxt和had,利用pre[i]=f[x],f[x]=i来处理pre 对于每个询问[l,r],只有pre[i]<l(l<=i<=r)的贝壳才会被算进答案(这里可以自己想一想为什么是这样) 也...

VIP专属博客通道 1290

Opencascade 保存点云为 .stp 和 .step 格式

总结一下,OpenCascade提供了强大的功能和工具,使我们能够方便地将点云数据保存为 .stp 和 .step 格式。通过使用类似于上述示例代码的方法,你可以使用OpenCascade库将点云数据保存为.STP和.STEP格式。总结一下,使用OpenCascade库,你可以方便地将点云数据保存为.STP和.STEP格式。通过使用类似于上述示例代码的方法,你可以将点云数据转换为OpenCascade的几何模型,并将其保存为所需的文件格式。请注意,上述代码仅涵盖了将点云数据保存为.STP格式的基本步骤。

CwzCode的博客 1157

IEC 104电力规约详细解读(一) - 报文结构、报文分类、ASDU

比如,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧,当然也可以不要求(S帧内容示例参考例1)。所以U帧格式的控制欲第一个字节就只有6种情况,分别是0x83(TESTER确认)、0x43(TESTER命令)、0x23(STOPDT确认)、0x13(STOPDT命令)、0x0B(START确认)、0x07(START命令)ASDU(应用服务数据单元),协议原文格式最好去101协议去看看,会比较详细。遥信、遥测、遥控、遥调、总召、对时等都需要使用I格式传送。

张二狗的博客 1万+

Luogu P1972 [SDOI2009]HH的项链

Luogu P1972 [SDOI2009]HH的项链 之前做过的一道题 模拟赛出了原题(当然是改头换面了的) 我竟然没有看出来。。。 考完LinJY 找出HH的项链 然后我一看题面就想起怎么做了。。。 发一下之前自己在luogu上写的blog 之前的代码: #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt; int a[10000...

YJY的博客 217

HyperLynx(十九)DDR(二)DDR的地址仿真

(5)设置水平标尺为2ns/div,垂直标尺为500mV/div,如果有必要,可以通过多次仿真,得到一个更加理想的结果。此外,还可以看到信号在高低电平切换时,反射波形基本趋于平缓,许多大的反射切换边缘已减小,这给了我们更大的定时裕量。如果这些DIMM是缓冲过的,则4个DIMM通道是可行的,但因为这是一个无缓冲DIMM,(20)在编辑传输线对话框中,选择“Values”选项卡,改变传输线长度为3in,具体设置如图所示,单击“确定”按钮。(17)为了增加电压摆幅,选择一个比原来的47Ω小的电阻。

小幽余生不加糖 4257

【luogu P1972 [SDOI2009]HH的项链】 题解

题目链接:https://www.luogu.org/problemnew/show/P1972 真是不懂为什么要卡莫队! #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using na...

202

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

luogu P1972 [SDOI2009]HH的项链

这题一开始我是这样子打的: #include&amp;amp;amp;lt;cstdio&amp;amp;amp;gt; #include&amp;amp;amp;lt;algorithm&amp;amp;amp;gt; #include&amp;amp;amp;lt;cmath&amp;amp;amp;gt; #define N 500010 using namespace std; struct node{int l,r,fr;}b[N];

Larry1118的博客 268

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

#树状数组# [luogu P1972] [SDOI2009]HH的项链

Title P1972 [SDOI2009]HH的项链 Solution 注意树状数组中ask函数中x>=1 莫队只能拿44分~~ 把询问根据右端点排序,然后用树状数组统计的是1−j1-j1−j中的不同的个数 每次将指针往右移,如果当前的数前面已经标记过了,就去掉前面的标记,在当前位置标记,因为前面的对现在询问的区间是没有贡献的。 Code #include<cstdio> #include<cmath> #include<algorithm> #include

Nowed 240

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

luogu P1972 [SDOI2009] HH的项链【莫队——奇偶优化详解】

题面 分析 莫队,往死里卡常,开O2加奇偶性优化可卡过 我才不会告诉你我这道题提交了37次呢 code // luogu-judger-enable-o2 #include&amp;amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;amp;gt; using namespace std; #define loop(i,start,end) for(register int i=start;i&amp;amp;amp;

AndrewLi的博客 2929

luogu P1972 [SDOI2009]HH的项链 树状数组

之前只做过分块做法,补一下树状数组做法。 我们先考虑一个问题,如何求从[1,x]这一区间内元素不同的个数?显然我们只要从到到位,遇到一个新的元素,就在对应位置+1,然后使用树状数组求前缀和即可。 这里我们需要去求[x,y],所求区间的左端点也会发生变化。我们先按照[1,x]的方法预处理出这个前缀和数组。我们考虑对询问区间按照左端点排序。然后对于当前的区间[x0,y0],query(y0) - ...

weixin_34019144的博客 118

树状数组-luogu-P1972-HH的项链

题目大意 给定一个长度为n的数列,给出m个询问,每个询问的内容为:统计指定闭区间[l,r]内不同元素的个数。 1<n,m<=2e6 问题分析 问题规模巨大,暴力枚举显然会超时。 因为操作中只有询问没有更新,所以可以使用离线算法。 经验判断。。。这一道可以用树状数组解决的问题,但分析如下: 这里我们需要求得任意区间内的不同元素个数,不同区间经常会存在在不同程度的重叠,直接...

奔跑吧蚂蚁呀 174

【Luogu】P1972 [SDOI2009] HH 的项链 (树状数组求区间内不同数的个数)

具体的,对于 1 2 1 2 3 这个数组,其权值数组 val 为 0 0 1 1 1,这样的话如果要查询的话我们只需要利用前缀和的方法就能求出来具体的值了。对于具体的更新操作,我们用一个 lst 数据记录某个数字上次出现的位置,如果本次查询的范围内某一个数字之前出现过,那么就要消除这个数字的权值,同时更新 lst,否则直径更新当前位置的权值,同时更新 lst。同时注意到对于一个区间如果我们已经修改完了,那么就不需要再次修改了,所以定义一个左边界 l,其代表我们已经修改到什么地方了,防止多余的修改。

qq_61422664的博客 308

Luogu P1972 [SDOI2009]HH的项链

很清新自然凶猛的数据结构题,都是套路啊 我们可以考虑离线做,先把区间按右端点从小到大排序 首先注意到一种贝壳如果在一段中出现超过1次,那么它在前面或后面就无关紧要了 举一个例子: 对于数列1 2 3 1如果我的右端点已经扫描到第四位了,那么第一位的1就可以删掉了(因为按右端点排了序) 所以我们开树状数组维护一个位置上是否有有效的颜色,即对于上一个例子2,3,4位上是有有效的颜色的 然后对...

weixin_30901729的博客 66

luogu P1972 [SDOI2009]HH的项链 (莫队(超时)/树状数组)

题链:https://www.luogu.com.cn/problem/P1972 思路1:如果考虑莫队的话就是模板题,只不过出题人卡常,会T。 #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e6+10; const int M = 1e6+10; int n,m,base; int a[N],num[M],ans[N],belong[N],cnt=0; struct no

birdmanqin的博客 251

[Luogu P1972] [BZOJ 1878] [SDOI2009]HH的项链

洛谷传送门 BZOJ传送门 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答……因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。 ...

LPA的博客 250
上一篇: SSL_2124 涂色
下一篇: SSL_2646 线段树练习题三
银河工程师
博客等级 码龄6年 7粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值