博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1972 [SDOI2009]HH的项链 解题报告
阅读量:4577 次
发布时间:2019-06-08

本文共 1128 字,大约阅读时间需要 3 分钟。

P1972 [SDOI2009]HH的项链

题目描述

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

输入输出格式

输入格式:

第一行:一个整数N,表示项链的长度。

第二行:N 个整数,表示依次表示项链中贝壳的编号(编号为0 到1000000 之间的整数)。

第三行:一个整数M,表示HH 询问的个数。

接下来M 行:每行两个整数,L 和R(1 ≤ L ≤ R ≤ N),表示询问的区间。

输出格式:

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

说明

数据范围:

对于100%的数据,N <= 500000,M <= 200000。


说两种做法吧

  • 离线树状数组

感觉很妙的做法,但确实也不好想(是我太蒻了)

对于平常的区间问题,我们通常采用诸如线段树树状数组一类的做法,令\(query(x)\)为查询1-x位置的区间的互异元素个数。但对于这个题,我们发现,在合并区间时出现了问题。

怎么办呢,观察题目,发现没有修改操作。于是想到可以按照一定的顺序进行离线访问问题来消除影响。

如果在查询\([l,r]\)区间时想让答案就为\(query(r)-query(l-1)\),应该怎么办呢?如果正常来看,应该把答案加上同在\([1,l-1],[l,r]\)点的个数,那就加上呗,我们把区间\([1,l-1]\)中又在后面出现的元素的位置上加上1.

如果我们把查询以左区间为关键字从小到大处理,我们就可以按顺序的动态更新对后面区间要加的个数而不影响前面的了。

需要注意的是,我们要加的元素位置是在它后面的离它最近的那个相等元素的位置。

code:

#include 
#include
const int N=500010;int n,m,num[N],next[N<<1],pos[N<<1],s[N],ans[200010],used[N<<1];struct node{ int l,r,id; bool friend operator <(node n1,node n2) { return n1.l

第二种做法是主席树维护区间第k大

有时间更新...

转载于:https://www.cnblogs.com/butterflydew/p/9190892.html

你可能感兴趣的文章
经FreeMarkerclasspath加载方式生成静态页面
查看>>
Bootstrap-maxlength使用
查看>>
UVA 10139 Factovisors(数论)
查看>>
找呀志_使用SQLiteDatabase增删改提供的搜索方法和事务
查看>>
springMVC框架建设进程
查看>>
军医王-moTestin云测试看好移动医疗行业
查看>>
OutputCache说明
查看>>
LSPCI具体解释分析
查看>>
Python+Django+SAE系列教程9-----Django的视图和URL
查看>>
Thinkpad T440p安装Linux的种种问题(by quqi99)
查看>>
电脑常见问题汇总:
查看>>
集合接口和类
查看>>
20145227《信息安全系统设计基础》期中总结
查看>>
20145227《信息安全系统设计基础》第十三周学习总结
查看>>
android第七节活动的生命周期
查看>>
Android Runnable 运行在那个线程
查看>>
find命令不递归查询子目录
查看>>
UITableView动态改变Cell高度
查看>>
iOS-Core-Animation-Advanced-Techniques
查看>>
PHP isset()与empty()的区别详解
查看>>