题目描述

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

输入输出格式

输入格式:

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

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

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

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

输出格式:

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

输入输出样例

输入样例#1:

6
1 2 3 4 3 5
3
1 2
3 5
2 6
输出样例#1:

2
2
4

数据范围:

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

---------------------------------------------------------------------------------------------------

这个数据一看就不能暴力标记什么的水过去

然后看到维护和询问的区间信息 所以很快想到了线段树

关键是维护的序列是什么呢?

我们选择维护一个1~n的序列 对每个点:为0表示此时下标表示的数不存在,为1表示此时下标表示的数存在

我们选择离线做法,先记录下每次询问 一边处理每个值 一边查询

将询问按照右端点排序,now记录当前访问到的询问

记last[i]数组 表示 i上一次出现的位置(即截止目前最后出现的位置

用一遍for循环 update贝壳的编号进入序列 即update(1,i,1); 表示现在在当前位出现

然后将上一次出现i的位置重置为0 即 update(1,last[a[i]],0); 并记下i出现的当前新位置last[a[i]]=i;

对于询问 每次从处理好的询问中 找出右端点和当前处理位置相同的询问 进行查询

怎样查询呢?

因为每一次我们只记录下了每个值最后出现的位置 以前的早已清零,所以查询一段区间中有多少的不同值就是做区间求和

于是就变成线段树的基本操作了ovo

注:1.注意线段树中查询操作的写法

  2.注意开够数组

贴个代码

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define N 500100
#define lc p<<1
#define rc p<<1|1
using namespace std;
int n,m;
int a[N];
struct node
{
int l,r,val;
}t[N<<]; struct pu
{
int x,y,id,ans;
}q[N];
bool cmp(pu a,pu b) { return a.y<b.y; }
bool cmp1(pu a,pu b) { return a.id<b.id; } void pushup(int p){
t[p].val=t[lc].val+t[rc].val;
}
void build(int p,int l,int r)
{
t[p].l=l; t[p].r=r;
if(l==r) return;
int mid=l+r>>;
build(lc,l,mid);
build(rc,mid+,r);
pushup(p);
}
void update(int p,int x,int v)
{
if(t[p].l==t[p].r)
{
t[p].val=v;
return;
}
int mid=t[p].l+t[p].r>>;
if(x<=mid) update(lc,x,v);
else update(rc,x,v);
pushup(p);
}
int query(int p,int ql,int qr)
{
//if(t[p].l<ql||t[p].r>qr) return 0;
if(ql<=t[p].l&&t[p].r<=qr)
return t[p].val;
int ans=;
int mid=t[p].l+t[p].r>>;
if(ql<=mid) ans+=query(lc,ql,qr);
if(qr>mid) ans+=query(rc,ql,qr);
return ans;
}
int last[];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&q[i].x,&q[i].y);
q[i].id=i;
}
build(,,n);
int now=;
sort(q+,q+m+,cmp);
for(int i=;i<=n;i++)
{
update(,i,);
if(last[a[i]]) update(,last[a[i]],);
last[a[i]]=i;
while(q[now].y==i)
{
q[now].ans=query(,q[now].x,q[now].y);
now++;
}
}
sort(q+,q+m+,cmp1);
for(int i=;i<=m;i++)
printf("%d\n",q[i].ans);
return ;
}

【SDOI2009】HH的项链 线段树的更多相关文章

  1. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  2. [bzoj1878][SDOI2009]HH的项链_树状数组

    HH的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列,m次查询.查询区间数的种类个数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 2\ ...

  3. 【BZOJ】1878: [SDOI2009]HH的项链(树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 我太弱了,看题解才过的. 一开始看到此题,我想了想在线做法,但之后觉得这个想法可能是错的:维护 ...

  4. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

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

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

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

  6. [BZOJ1878][SDOI2009] HH的项链 (树状数组)

    link 一道简单题. 不用可持久化. 对于统计颜色个数,可以看与其颜色一样的前一个位置. 设$las(i)$表示其与$i$颜色相等的上一个位置. 则对于二元组$(l,r)$,其答案为$\sum_{i ...

  7. bzoj 1878: [SDOI2009]HH的项链【树状数组】

    对于一个lr,每个颜色贡献的是在(1,r)区间里出现的最右位置,所以记录一个b数组表示当前点这个颜色上一个出现的位置 然后把询问离线,按r升序排序 每次把右端点右移,把这个点在树状数组上+1,并且在当 ...

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

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

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

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

随机推荐

  1. 使用adbWireless无线调试Android真机设备[转]

    开发Android的朋友都知道,真机调试需要把手机与PC相连,然后把应用部署到真机上进行安装和调试.长长的USB线显得很麻烦,而且如果需要USB接口与其他设备连接的话显得很不方便.今天介绍一种不通过U ...

  2. Netweaver工作进程的内存限制 VS CloudFoundry应用的内存限制

    Netweaver 一个会话进程能够在堆上申请的内存大小上限, 在事务码RZ11里查看参数abap/heap_area_dia: CloudFoundry 每个应用可以在manifest.yml里定义 ...

  3. WordPress企业建站心得

    回头聊聊我用WordPress做企业网站的事.说是企业网站,其实就是一个小的企业展示网站.事情要从我爸开了一家自行车店开始说起,自从他开了自行车店,不但开始学着玩起了微信(因为要做微信营销),又想到了 ...

  4. Android(java)学习笔记98:如何让你的GridView不再滚动

    1. 如何让你的GridView不再滚动: GridView显示不完整的原因是因为,他的外层也套用了一个滑动的控件,这个解决办法是:重写GridView,是控制GridView不能滚动,就是写一个类继 ...

  5. python 数据库操作 SQLite、MySQL 摘录

    转自: http://www.cnblogs.com/windlaughing/p/3157531.html 不管使用什么后台数据库,代码所遵循的过程都是一样的:连接 -> 创建游标 -> ...

  6. Java环境变量搭建(Windows环境)

    变量名:JAVA_HOME 变量值:C:\Program Files (x86)\Java\jdk1.8.0_91        // 要根据自己的实际路径配置 变量名:CLASSPATH 变量值:. ...

  7. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  8. CUDA中记录执行时间-GPU端

    事件eventcudaEvent_t start,stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord ...

  9. bootstrap3 文档随看

    唉 昨天看的是2,早知道就只可以看3啦,虽然整体不变,但是小改小闹的还是很多啦.产品上线是需要升级的,但是像这么改会很烦哎,有些样式名字修改,用法修改,功能修改,那让用惯了2的人还得把之前记忆清除了然 ...

  10. vue实现tab切换功能精简版

    <template> <div> <p class="tabs" v-for="(list,index) in lists" :c ...