P1972 [SDOI2009] HH的项链

这篇具有很好参考价值的文章主要介绍了P1972 [SDOI2009] HH的项链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[SDOI2009] 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 , r l,r l,r,表示询问的区间。

输出格式

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

样例 #1

样例输入 #1

6
1 2 3 4 3 5
3
1 2
3 5
2 6

样例输出 #1

2
2
4

提示

【数据范围】

对于 20 % 20\% 20% 的数据, 1 ≤ n , m ≤ 5000 1\le n,m\leq 5000 1n,m5000
对于 40 % 40\% 40% 的数据, 1 ≤ n , m ≤ 1 0 5 1\le n,m\leq 10^5 1n,m105
对于 60 % 60\% 60% 的数据, 1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m\leq 5\times 10^5 1n,m5×105
对于 100 % 100\% 100% 的数据, 1 ≤ n , m , a i ≤ 1 0 6 1\le n,m,a_i \leq 10^6 1n,m,ai106 1 ≤ l ≤ r ≤ n 1\le l \le r \le n 1lrn

本题可能需要较快的读入方式,最大数据点读入数据约 20MB



解析:

第一眼是莫队,一看数据范围是 1 0 6 10^6 106,莫队估计是不行了。

点开标签,有可持久化线段树,那就用主席树做吧。

每个版本的主席树维护的是前缀和中的信息。对于数字 a i a_i ai,版本 r t rt rt 维护的是左侧距离 r t rt rt 最近的 a i a_i ai

对于 a i a_i ai,如果之前 a i a_i ai 未出现,进行一次修改即可;如果之前出现了,先删掉上一个 a i a_i ai,在把当前 a i a_i ai 加进去

对于询问 ( l , r ) (l,r) (l,r),在版本为 r r r 的主席树内查询 [ l , n ] [l,n] [l,n] 中数的个数。在每个版本中,一个数最多出现一次,因此可以实现查询。

输入和输出用快读和快写。文章来源地址https://www.toymoban.com/news/detail-410955.html

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define fi first
#define se second
const int maxn = 1e6+10;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> pii;

struct node{
	int ls, rs, sum;	
}t[maxn * 36];
int tot, n, m, a[maxn], las[maxn], root[maxn];
void build(int &rt, int l, int r){
	rt = ++tot;
	if(l == r)
		return;
	int mid = (l+r) >> 1;
	build(t[rt].ls, l, mid);
	build(t[rt].rs, mid+1, r);	
}
void update(int &rt, int pre, int l, int r, int pos, int v){
	rt = ++tot;
	t[rt].ls = t[pre].ls; t[rt].rs = t[pre].rs, t[rt].sum = t[pre].sum + v;
	if(l == r && l == pos)
		return;
	int mid = (l+r) >> 1;
	if(pos <= mid)
		update(t[rt].ls, t[pre].ls, l, mid, pos, v);
	else
		update(t[rt].rs, t[pre].rs, mid+1, r, pos, v);
}
int query(int k, int l, int r, int pos){
	if(l == r)
		return t[k].sum;
	int mid = (l+r) >> 1;
	if(pos <= mid)
		return query(t[k].ls, l, mid, pos) + t[t[k].rs].sum;
	else
		return query(t[k].rs, mid+1, r, pos);
}
int read() {
	int x = 0, f = 1;
	char c = getchar();
	while(c<'0' || c>'9'){
		if(c == '-') 
			f = -1;
		c = getchar();
	}
	while(c>='0' && c<='9') {
		x = x*10 + c-'0';
		c=getchar();
	}		
	return x*f;
}
void write(int x) {
	if(x < 0) 
		putchar('-'), x = -x;
	if(x > 9) 
		write(x/10);
	putchar(x%10 + '0');
}
int main(){
	n = read();
	build(root[0], 1, n);
	for(int i = 1; i <= n; i++){
		a[i] = read();
		if(las[a[i]] != 0){
			int tmp; 
			update(tmp, root[i-1], 1, n, las[a[i]], -1);
			update(root[i], tmp, 1, n, i, 1);
		}
		else
			update(root[i], root[i-1], 1, n, i, 1);		
		las[a[i]] = i;
	}
	m = read();
	while(m--){
		int l, r;
		l = read(); r = read();
		int res = query(root[r], 1, n, l);
		write(res); putchar('\n');
	}
	return 0;
}

到了这里,关于P1972 [SDOI2009] HH的项链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从[SDOI2011]消防 到[NOIP2007]树网的核

    有关消防一题中最优解一定在直径上的证明 P2491 [SDOI2011] 消防 P1099 [NOIP2007 提高组] 树网的核 在一颗 (n) 个节点的无根树中,找到一条不超过 (s) 的路径,使得图中所有点到此路径距离的最大值最小,图中边权非负 若想将此题转化到树网的核,需要证明 对于任意一条不在直

    2024年02月05日
    浏览(31)
  • 石子合并+环形石子合并+能量项链+凸多边形的划分——区间DP

    一、石子合并 (经典例题) 设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合

    2024年02月19日
    浏览(43)
  • python获取当前年月日时分秒,格式(YYYY-HH-HH HH-FF-SS)

    如果你希望在年、月、日、时、分和秒之间使用短横线(-)进行分隔,你可以使用字符串的 format 方法或者f-string来构建输出字符串。以下是修改后的代码: 使用字符串的 format 方法: 使用f-string: 无论你选择哪种方法,它们都会输出类似于\\\"当前时间:2023-05-16 14:30:59\\\"的结果

    2024年02月14日
    浏览(50)
  • pycharm如何给一串中文快捷加引号(方法二)

    点击上方“ Python爬虫与数据挖掘 ”,进行关注 回复“ 书籍 ”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 商人重利轻别离,前月浮梁买茶去。 大家好,我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个 Pycharm 基础的问题,这里拿出来给大家分享下。

    2024年02月13日
    浏览(27)
  • C语言—统计一串字符中各个字符的出现频率

    编写程序,能够统计某一段字符串中各个字符出现的次数。比如输入一串“abcade”,能够统计出其中各个字母的出现频率。 这里实现思路比较巧妙,变量 i 用来做for循环的变量。 num[] 这个数组是给每一个ASIIC字符开辟的数组,通过 (int)str[i] 在遍历整个输入字符串str[]的同时,

    2024年02月08日
    浏览(37)
  • 串口通信(6)应用定时器中断+串口中断实现接收一串数据

     本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! 发布人:@日月同辉,与我共生_单片机-CSDN博客 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。 系列专栏: CSDN- 单片机串

    2024年02月06日
    浏览(53)
  • 奇舞周刊第503期:图解串一串 webpack 的历史和核心功能

    记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~  图解串一串 webpack 的历史和核心功能 提到打包工具,可能你会首先想到 webpack。那没有 webpack 之前,都是怎么打包的呢?webpack 都有哪些功能?为什么这么设计呢?这篇文章我们就来一起探究一

    2024年02月11日
    浏览(38)
  • 2009年软件评测师真题精选

    1、关于软件测试,(31)的叙述是正确的。 ①测试开始越早,越有利于发现软件缺陷 ②采用正确的测试用例设计方法,软件测试可以做到穷举测试 ③测试覆盖度和测试用例数量成正比 ④软#测试的时间越_长越好 (31)A.④ B.① C.②、③ D.①、③ 【答案】B 【解析】本题考查

    2024年02月03日
    浏览(32)
  • CentOS 7(2009) 升级 GCC 版本

       CentOS 7 默认安装的 gcc 版本为 4.8 ,但是很多时候都会需要用到更高版本的 gcc 来编译源码,那么本文将会介绍如何在线升级 CentOS 的 gcc 版本。 (1). 安装 centos-release-scl ; (2). 安装 devtoolset ; [注]:笔者这里安装的是 gcc 7.x 版本的,若想安装其它版本,则修改对应的大版本

    2024年02月03日
    浏览(43)
  • STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流

    方法一、使用宏定义判断IDLE标志位 空闲的定义是总线上在一个字节的时间内没有再接收到数据,USART_IT_IDLE空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。 串口空闲中断(UART_IT_IDLE):STM32的IDLE的中断在串口无数据接收的情况

    2024年01月23日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包