洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)
•题意
给你一个包含 n 个数的数组 $a$;
有 m 此操作,每次操作求区间 [l,r] 中不同数的个数;
•题解(离线+树状数组)
以样例 $[1,2,3,4,3,5]$ 为例,求解区间 $[2,6]$ 的不同数的个数;
按照模拟思路,肯定是从后往前查找不同数的个数;
从 $6$ 开始,向前查找的结果为:$[5,3,4,2]$ 共四个数;
你会发现 3 在区间 $[2,6]$ 出现了两次,但是,只需要距右端点 $6$ 最近的那个 3;
也就是说,对于多个区间询问,我们可以将这些询问按照右端点(r)排序;
对于处理到的区间 $[l_i,r_i]$,如果当前处理的数 $val$ 在之前出现过;
那么,按照优先靠近右端点的思想,将之前出现的 $val$ 的位置从树状数组中减去;
将当前的 $val$ 的位置加入到树状数组中;
判断当前位置的 $val$ 是否出现过及最靠近当前位置的 $val$,用个数组 $last$ 存储 $val$ 在 [1,当前位置-1] 中最后出现的位置即可;
查询的话,树状数组中 $Sum(r_i)$ 指的是 $[1,r_i]$ 中靠近右端点且不重复的数的个数;
那么,当前区间的答案就为 $Sum(r_i)-Sum(l_i-1)$;
•Code
莫名bug:
将第 52~53 行代码合并成 last[a[index]]=index++;
就 WA 了;
疑惑解决:
int index = 1;
a[index]=index++;
上述语句,我所期待的结果是 a[1]=1 , index=2;
但实际是 a[2]=1 , index=2;
也就是说,在 a 调用 index 时已经将 index++ 了,而右边等这个语句全部结束后才++;
即 a 用的是 2 赋值为 1 后, index=index+1;
也就是输出结果 a[2]=1 , index=2;
•题解(在线+主席树)
要用主席树的话,首先得明确每棵树要维护什么;
上述题解,得到了一个结论,对于询问的区间 $[l,r]$,$[1,r]$ 中重复的数要优先考虑靠近 r 的那个;
这样的话,我们就可以用主席树维护 $[1,r]$ 中不重复的数的个数;
及 $rt_1,rt_2,\cdots ,rt_n$ 这 n 可树分别维护 $[1,1],[1,2],\cdots ,[1,n]$ 中不重复数的个数;
假设当前需要处理第 r 个数,及需要构造的第 r 棵树;
对于即将插入主席树中的数 $a_r$,先判断一下 $a_r$ 在此之前是否出现过,并且要确定之前出现过的距 $r$ 最近的位置;
这个也很好找,直接用 $last$ 数组就行;
维护的话,如果 $val$ 在之前出现过,就将其距 $r$ 最近的位置记录的值删掉,加入到当前的位置 $r$;
对于区间 $[l,r]$ 查询的话,直接在 $rt_r$ 这颗树上查找相应区间 $[l,r]$ 中不重复数的个数即可,线段树的常规操作;
(PS:这道题目的数据加强了,在线主席树是会 TLE 的,只能选择离线做法,我做这道题的目的是复习一下主席树,想 AC 的话,去这儿)
•Code
洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)的更多相关文章
- 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 洛谷 P1972 [SDOI2009]HH的项链 解题报告
P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...
- 洛谷——P1972 [SDOI2009]HH的项链(线段树)
P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的 ...
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)
传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...
- 洛谷P1972 [SDOI2009]HH的项链 题解
[SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...
- 洛谷P1972 [SDOI2009]HH的项链(树状数组)
题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...
- 洛谷 P1972 [SDOI2009]HH的项链——树状数组
先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...
- 洛谷 P1972 [SDOI2009]HH的项链
不是裸题,鉴定完毕. 我是题面 对于这道题,我是离线做的... 树状数组吧,好些点 我们可以很轻易地得到一个很显然的结论,就是关于同一个数,我们只需要记录它不超过当前区间的最后一次出现的位置即可.举例 ...
随机推荐
- 剑指offer 1-6
1. 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析 ...
- 19-2 from和modelform的用法和介绍
一 form 1. form的作用 1. 生成HTML代码 2. 帮我们做数据有效性的校验 3. 保留上次输入内容,显示错误提示 2. form组件校验数据有效性 1. 内置的校验规则 1. re ...
- C++中String字符串查找
在写C++程序中,总会遇到要从一个字符串中查找一小段子字符串的情况,对于在C中,我们经常用到strstr()或者strchr()这两种方法.而对于C++的string,我们往往会用到find(). C ...
- 四.使用JDBC进行批处理操作
1 create table testbatch 2 ( 3 id int primary key, 4 name varchar(20) 5 ); 在实际的项目开发中,有时候需要向数据库发送一批SQ ...
- apache服务器配置防盗链(centos7)
<Directory /data/wwwroot/xwl.com> SetEnvIfNoCase Referer "^$" local_ref SetEnvIfNoCa ...
- HDU-1160_FatMouse's Speed
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Sp ...
- ROS开发过程中遇到:Could not find a package configuration file provided by "qt_build" with any of the following names: qt_buildConfig.cmake qt_build-config.cmake........
最近在搭建QT开发ROS 界面的环境,遇到了很多问题,参考了很多资料,最后发现有些问题其实没有那么复杂,只是我们对整体环境还不了解,熟悉了以后你会发现有些问题就迎刃而解了. 在这个过程中,我首先新建了 ...
- 从零学React Native之06flexbox布局
前面我们接触了好多React Native代码, 并没有介绍RN中的组件具体是如何布局的,这一篇文章,重点介绍下flexbox布局. 什么是flexbox布局 React中引入了flexbox概念,f ...
- BT17破解软件
大家好我QQ是1617089375 有非常多网友非常好奇新版BT17无线网破解软件究竟怎么样.无图无真相,所以我上传给大家看看,眼下视频正在录制.稍后也会把相应的视频公布到网上.因为 ...
- python中'0b111'中的b 是什么意思
https://zhidao.baidu.com/question/987330764742072579.html binary,二进制的意思