Description

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

Input

第一行:一个整数N,表示项链的长度。 
第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 
第三行:一个整数M,表示HH询问的个数。 
接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
N ≤ 50000,M ≤ 200000。

Output

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

Sample Input

6
1 2 3 4 3 5
3
1 2
3 5
2 6

Sample Output

2
2
4
————————————————————————————————
这道题我们维护一下每个点的pre[i]

即对于每个位置i,预处理出pre[i]表示i左边离i最近的j 使得a[i]==a[j]

然后我们枚举右端点 维护一下每个左端点的答案就可以辣

即扫到一个点i的时候 s[pre[i]]-- s[i]++ 维护一下树状数组的差分就行了

因为你当前往前必然包含这个点 所以前面的区间的同一颜色的位置对当前以及后面的区间都没有任何影响了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
const int M=1e5+7;
int read(){int ans=0,f=1,c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int n,m,k;
int ans[5*M],last[15*M],pre[15*M],s[M];
struct pos{int x,id;};
std::vector<pos>q[M];
int l,r;
#define lowbit(x) x&-x
void ins(int x,int v){while(x<=n) s[x]+=v,x+=lowbit(x);}
int query(int x){int sum=0;while(x) sum+=s[x],x-=lowbit(x);return sum;
}
int main(){n=read();for(int i=1;i<=n;i++){k=read();if(last[k]) pre[i]=last[k];last[k]=i;}m=read();for(int i=1;i<=m;i++) l=read(),r=read(),q[r].push_back((pos){l-1,i});for(int i=1;i<=n;i++){if(pre[i]) ins(pre[i],-1);ins(i,1);int mx=q[i].size(),now=query(i);for(int j=0;j<mx;j++){int x=q[i][j].x;ans[q[i][j].id]=now-query(x);}}for(int i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/lyzuikeai/p/7665605.html

bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分相关推荐

  1. bzoj 1878: [SDOI2009]HH的项链(主席树)

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 5317  Solved: 2624 [Submit][Sta ...

  2. BZOJ 1878: [SDOI2009]HH的项链

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 3548  Solved: 1757 [Submit][Sta ...

  3. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

  4. bzoj 1878: [SDOI2009]HH的项链

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

  5. BZOJ 1878: [SDOI2009]HH的项链 | 莫队

    题解: http://www.lydsy.com/JudgeOnline/problem.php?id=1878 题解: 莫队板子题 核心思想是对区间的询问离线之后按照合理的顺序来优化复杂度 一般的做 ...

  6. 【HDU - 6203】ping ping ping(lca+贪心思想,对lca排序,树状数组差分)

    题干: 给出一个n+1个点的树,以及p个点对,需要断开一些点,使得这p个点对路径不连通.输出应该断开的最少点数. 解题报告: 从那p个点对入手的话:首先考虑只有一对点的话,肯定是这条路径上的随便一个点 ...

  7. 【BZOJ】[SDOI2009]HH的项链

    [算法]主席树||离线+树状数组 [题解] 主席树经典应用:找区间不同的数字个数. 做法:记录每个数上一次出现的位置last[i],对last建权值线段树,对于区间询问last[i]<L的数字个 ...

  8. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

  9. BZOJ.3648.寝室管理(点分治 树状数组)

    BZOJ \(Description\) 求在一棵树上加一条边后,有多少条至少有\(k\)个点的路径. \(n\leq10^5\). \(Solution\) 对于一棵树的情况,可以点分治. 用树状数 ...

最新文章

  1. Windows快捷键集锦
  2. 在国外读phd 的时候和supervisor沟通的时候需要注意的点
  3. elasticsearch高亮显示查询结果
  4. HTML/CSS学习笔记02【表单标签】
  5. mysql导入csvnull,MySQL Workbench从CSV导入NULL
  6. 搭建Android开发环境的介绍
  7. ojdbc14_g.jar与ojdbc14.jar区别
  8. java 异常哪个包,这个提示包不存在的异常是咋回事
  9. live555 源代码简单分析1:主程序
  10. flutter 防止键盘弹出 导致超出屏幕
  11. 110kv/35kv变电所无功补偿技术的研究+matlab仿真模型
  12. 爬虫精进(六) ------ 项目实操
  13. 【毕业设计】基于单片机的便携式空气质量检测仪 - 物联网 嵌入式
  14. CentOS7下安装和开启远程连接reids
  15. 数据中心交换机的五大法宝
  16. nginx:重启linux服务之后保持nginx重启,nginx后台自启动
  17. Clamav 杀毒软件安装
  18. 中华英才网三年之痒 接受增持还是坚持独立IPO
  19. 聊聊Redis的数据热点问题
  20. Nginx的静态资源缓存以及压缩

热门文章

  1. 攻击需要成本吗_石子厂成本大概多少?开一个石子厂都需要哪些设备,价格高吗 ?...
  2. python过拟合_梯度下降、过拟合和归一化
  3. html设置nav标签高度,html – Bootstrap带导航栏的100%高度
  4. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...
  5. Moment.js在Vue中使用
  6. 南京江宁软通动力怎么样_南京有什么美食?有哪些必游景点?
  7. 纯惯导卡尔曼滤波器代码实例解读01
  8. sqlserver 2008r2 查看表结构及视图、版本及数据类型(字段)
  9. [vb]利用WScript.Shell对象隐藏cmd命令行运行
  10. Nature最新封面:机器人进军考古界,破解3亿年前生物谜团 | 附Demo