题目大意:给你一个序列,求某区间出现不同的数的个数。

貌似离线树状数组是最好的解法

先把所有询问挂在它们询问的右端点上

然后从头到尾遍历这个序列,记录这个位置的值上一次出现的位置

那么,当遍历到第i位时,如果a[i]在之前出现过,就在它上一次出现的位置-1

这个操作的意义是,第i位已经有a[i]了,那么上一次出现a[i]的位置已经失去意义

接着在这个位置+1,更新last[a[i]]。差分操作用树状数组维护

然后我们遍历以这个位置为结尾的所有询问,用树状数组查前缀和,因为在a[i]相同的位置不会重复打差分,所以query(r)-query(l-1)即为这个询问的答案。

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
#define ll long long
#define N 500100
#define maxn 1000000
using namespace std;
//re
int n,m,cte;
int a[N],head[N];
int lst[N*],sum[N*];
struct Ques{
int l,r,ans,id;
}ques[N];
struct EDGE{
int to,nxt;
}edge[N];
void edge_add(int u,int v)
{
cte++;
edge[cte].to=v;
edge[cte].nxt=head[u];
head[u]=cte;
}
int cmp1(Ques s1,Ques s2) {return s1.r<s2.r;}
int cmp2(Ques s1,Ques s2) {return s1.id<s2.id;}
void update(int x,int w) {for(int i=x;i<=maxn;i+=(i&(-i)))sum[i]+=w;}
int query(int x) {int ans=;for(int i=x;i>;i-=(i&(-i)))ans+=sum[i];return ans;} int main()
{
//freopen("data.in","r",stdin);
scanf("%d",&n);
memset(head,-,sizeof(head));
for(int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%d%d",&ques[i].l,&ques[i].r),ques[i].id=i;
sort(ques+,ques+m+,cmp1);
for(int i=;i<=m;i++)
edge_add(ques[i].r,i);
for(int i=;i<=n;i++)
{
if(lst[a[i]]) update(lst[a[i]],-);
update(i,),lst[a[i]]=i;
for(int j=head[i];j!=-;j=edge[j].nxt){
int v=edge[j].to;
ques[v].ans=query(ques[v].r)-query(ques[v].l-);
}
}
sort(ques+,ques+m+,cmp2);
for(int i=;i<=m;i++) printf("%d\n",ques[i].ans);
return ;
}

BZOJ 1878 HH的项链 (树状数组+离线)的更多相关文章

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

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3486  Solved: 1738[Submit][Statu ...

  2. BZOJ1878: [SDOI2009]HH的项链[树状数组+离线 | 主席树]

    题意: 询问区间不同种类颜色数 [2016-11-15] 离线好厉害 对于每一个区间询问,一个数只考虑一次,那么考虑他最后出现的一次 将询问按r排序 从1到n扫描,用树状数组维护一个位置应不应该考虑( ...

  3. 【bzoj1878】[SDOI2009]HH的项链 - 树状数组 - 离线处理

    [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4834  Solved: 2384[Submit][Status][Dis ...

  4. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

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

  5. [SDOI2009]HH的项链 树状数组 BZOJ 1878

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

  6. BZOJ 1878 SDOI2009 HH的项链 树状数组/莫队算法

    题目大意:给定一个序列.求一个区间内有多少个不同的数 正解是树状数组 将全部区间依照左端点排序 然后每次仅仅统计左端点開始的每种颜色的第一个数即可了 用树状数组维护 我写的是莫队算法 莫队明显能搞 m ...

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

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

  8. 【bzoj1878】[SDOI2009]HH的项链 树状数组

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

  9. bzoj1878 [SDOI2009]HH的项链——树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 离线树状数组,巧妙的思路呢: 给每种项链记录一个最后出现的位置lst,根据项链最后出现 ...

随机推荐

  1. linux下RTP编程(使用JRTPLIB)(转)

    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关键 ...

  2. VLC编译

    http://blog.csdn.net/hdh4638/article/details/7602321 1 下载代码 ki.videolan.org/VLC_Source_code git colo ...

  3. J2EE异常问题总结

    http://blog.csdn.net/rchm8519/article/details/41624381 http://www.51testing.com/html/49/240349-14393 ...

  4. Innodb性能优化之参数设置

    现在,Innodb是Mysql最多使用的存储引擎.其性能一直广受关注.本文通过基本的参数设置来提高其性能. innodb_buffer_pool_size 缓冲池大小.这是innodb参数中最重要的设 ...

  5. 如何使用GUID类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. Spring 注解学习笔记

    声明Bean的注解: @Component : 组件,没有明确的角色 @Service : 在业务逻辑层(service层)使用 @Repository : 在数据访问层(dao层)使用. @Cont ...

  7. POJ 3177--Redundant Paths【无向图添加最少的边成为边双连通图 &amp;&amp; tarjan求ebc &amp;&amp; 缩点构造缩点树】

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10798   Accepted: 4626 ...

  8. Android 经常使用设计模式(一)

    由于项目变更的频繁性,作为一名程序猿,我们须要掌握设计模式的必要性.就不言而喻~~.以下就是一些我自己学习的设计模式总结. 接下来,主要是针对几个比較经常使用模式进行解说,主要是以下几种: 观察者模式 ...

  9. unix关于打包命令zip的使用

    unix zip命令的基本使用方法是: zip [參数] [打包后的文件名称] [打包的文件夹路径] linux zip命令參数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 - ...

  10. POJ 题目3461 Oulipo(KMP)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26479   Accepted: 10550 Descript ...