传送门

•题意

  给你一个包含 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

  离线树状数组查询区间多少个不同的数.cpp

  莫名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

  在线主席树查询区间多少个不同的数.cpp

洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)的更多相关文章

  1. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  2. 洛谷 P1972 [SDOI2009]HH的项链 解题报告

    P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...

  3. 洛谷——P1972 [SDOI2009]HH的项链(线段树)

    P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的 ...

  4. 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  5. 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)

    传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...

  6. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

  7. 洛谷P1972 [SDOI2009]HH的项链(树状数组)

    题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...

  8. 洛谷 P1972 [SDOI2009]HH的项链——树状数组

    先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...

  9. 洛谷 P1972 [SDOI2009]HH的项链

    不是裸题,鉴定完毕. 我是题面 对于这道题,我是离线做的... 树状数组吧,好些点 我们可以很轻易地得到一个很显然的结论,就是关于同一个数,我们只需要记录它不超过当前区间的最后一次出现的位置即可.举例 ...

随机推荐

  1. PHP 中Session 反序列化机制的三种方法

    �php.ini中存在三项配置项: session.save_path="" --设置session的存储路径 session.save_handler=""- ...

  2. Mybatis中example类的使用

    要使用example类,先要在项目中导入mybatis.mapper的jar包. Mapper接口中包含了单表的增删改查以及分页功能. 给出实例: CountryMappermapper = sqlS ...

  3. 利用阿里大于实现发送短信(JAVA版)

    本文是我自己的亲身实践得来,喜欢的朋 友别忘了点个赞哦! 最近整理了一下利用阿里大于短信平台来实现发送短信功能. 闲话不多说,直接开始吧. 首先,要明白利用大于发送短信这件事是由两部分组成: 一.在阿 ...

  4. Leetcode747.Largest Number At Least Twice of Others至少是其他数字两倍的最大数

    在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums = [3, ...

  5. keystone同步数据库的时候提示error

    keystone 在同步的时候报出以下错误: su -s /bin/sh -c "keystone-manage db_sync" keystone CRITICAL keysto ...

  6. element-ui select 二级联动

    在使用select 选择框时,2个select 怎么关联在一起(第一个值发生变化,第二个select值随第一个变化而不同)  两个输入框代码 <el-form :inline="tru ...

  7. MacOS配置双网

    目的 日常工作中,我们可能会同时需要用到公司的内网以及互联网,为了避免来回的切换,我们可以通过配置电脑的两个网卡来实现同时访问内网和互联网. 环境说明 互联网 无线网卡 网关 子网掩码 内网 有线网卡 ...

  8. NSString&NSMutableString常用操作梳理

    http://www.cocoachina.com/ios/20150724/12722.html 上一篇梳理了NSArray&NSMutableArray常用操作,这次来梳理一下Object ...

  9. Java练习 SDUT-2253_分数加减法

    分数加减法 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写一个C程序,实现两个分数的加减法 Input 输入包含多 ...

  10. 快速删除项目中的输出日志console.log

    项目开发时,控制台往往有许多忘记删除或注释掉的输出日志.但是上线后总不能一个一个删吧,最近总结出几个解决思路 重写console.log方法,使其失去 输出能力 这个最直接有效,用vue框架的话放在m ...