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;
}
射频工程师笔记---射频通信基础 回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来... 阅读详情

相关推荐

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3007

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

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

qq_62539009的博客 501

VCU128开发板上手记:搞定100G以太网IP核与QSFP光模块的那些坑

本文详细介绍了在VCU128开发板上实现100G以太网IP核与QSFP光模块调试的实战经验。从硬件准备、IP核配置到QSFP模块控制信号处理,文章揭示了数据手册中未提及的关键细节,并提供了优化参数和压力测试方案,帮助开发者快速解决UltraScale+平台下的高速以太网部署难题。

weixin_30740295的博客 520

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

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

qq_35687225的博客 725

VBA中如何使用Edge内核Browser?

在微软宣布停止对IE的支持后,许多使用VBA中Web Browser的用户遇到了困境,因为Web Browser使用的IE内核。然而微软并没有给出支持Edge的新版Web Browser,网上许多第三方的库也不够完善。经过调研,libEdge可以较好的和VBA集成,实现在Excel中打开Browser,甚至能够通过执行js代码,获取web页面的信息。项目需要WebView2Loader.dll和LibEdge.dll两个库,区分x86和x64版本。

金木AI 2398

PCout(n) -- STM32F103RCT6 位带操作

位带操作,sys.h,PCout,PAout,PAout

weixin_50212044的博客 4021

[SDOI2009]HH的项链

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

eyuhaobanga的博客 407

告别谷歌翻译失效!手把手教你用Immersive Translate插件实现双语网页阅读(附Chrome/Edge/Firefox保姆级配置)

本文详细介绍了如何使用Immersive Translate插件实现双语网页阅读,解决谷歌翻译失效的问题。通过Chrome、Edge和Firefox的保姆级配置指南,帮助用户轻松安装和使用这款支持双语对照、智能识别网页内容的翻译插件,提升外文资料阅读效率。

weixin_28683689的博客 486

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

[图解]SysML与EA实战:住宅安全系统接口块设计全解析

本文详细解析了使用SysML和EA工具进行住宅安全系统接口块设计的全流程。从系统上下文图入门到接口块实战技巧,涵盖块定义图与内部块图的视角转换,以及多图协同建模方法论。特别分享EA工具的高效操作指南和常见问题避坑建议,帮助工程师掌握精确信号定义、端口方向设置等关键技能,提升安防系统设计效率。

weixin_29234509的博客 333

69页完整版智慧港口综合解决方案

智慧港口需求4港机远程操控等自动化改造需求自动化码头AGV无线通信及专用视频系统需求安全生产视频监控类需求港机RCMS及设备管理需求岸边智能理货码头三维全景应用智慧港口解决方案5自动化码头AGV/跨运车/无人集卡无线接入港机远控视觉及冗余无线通信视觉集卡防吊起系统集装箱码头岸边智能理货港机RCMS系统无线接入港机智能化管理(无线高清视频监控、一键报警、远程抄表系统)港口拖轮无线接入岸边溢油监测系统TD-LTE覆盖及业务终端接入港口生产管理系统港口可视化集群调度港口GiNMS综合网络设备智能管理全球作业效率最

zuoan1993的博客 2129

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

Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

洛奇看世界 2438

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

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

202

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

#树状数组# [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

温度PID控制PLC程序

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

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、付费专栏及课程。

余额充值