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

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

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

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

那么,当遍历到第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. UVA1586 - Molar mass(紫书习题3.2)

    HJL是一个从不讽刺人的品学兼优的好孩子,她最近沉迷学习化学而不能自拔.然而计算一个分子的相对分子质量使她烦不胜烦,因此她决定请你写一个程序来帮助她计算这种麻烦的事情. 已知: ①C代表的碳元素的相对 ...

  2. MySQL 触发器 -1

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  3. 洛谷—— P3353 在你窗外闪耀的星星

    https://www.luogu.org/problem/show?pid=3353 题目描述 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年 ...

  4. [Azure][Windows Azure介绍]C1了解Windows Azure

    本章介绍了Windows Azure平台,并介绍了该平台提供的不同的服务和解决方案.本章主要针对还不熟悉什么Windows Azure是和它能做什么的读者.如果你已经熟悉了Windows Azure, ...

  5. [SharePoint][SharePoint Designer 入门经典]Chapter12 高级工作流

    1.使用Visio2010创建工作流标志 2.使用Visio Graphic服务可视化一个运行的工作流 3.使用InfoPath2010修饰工作流表单 4.导出可重用的工作流

  6. Tcl学习之--表达式

    l 数值操作数 表达式的操作数一般是整数或实数.整数可能是十进制.二进制,八进制或十六进制. 比方以下同一个整数 335               --> 十进制 0o517         ...

  7. js面向对象编程:怎样实现方法重载

    js中怎样实现方法重载?这涉及到三个问题 1同名函数的调用问题 2函数中特殊的參数arguments 3怎样利用arguments实现方法重载 1同名函数的调用问题 都知道在js中假设存在多个名称同样 ...

  8. 大型Web 站点 Asp.net Session过期你怎么办

    在 WEB 系统中. 我们通常会用session来保存一些简单可是却非常重要的信息.比方Asp.net中常常会用Session来保存用户登录信息,比方UserID.为了解决 WEB场大家採用了把ses ...

  9. Ruby学习(三)——类与对象(1)

    今天看了<Ruby元编程>,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家.其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧 ...

  10. SQL Server loop - how do I loop through a set of records

    SQL Server loop - how do I loop through a set of records By using T-SQL and cursors like this : DECL ...