[TK] HH的项链 离线树状数组解法
实际上这题很难和树状数组联系起来,我感觉效率也不是很高,感觉不是正解
怎么使用树状数组
这道题我们很容易想到一点:同种物品在一个区间内只能出现一次,先不考虑别的问题,我们想出下面这种使用树状数组的思路:
- 定义树状数组只有 \(0\) 和 \(1\) 两种状态,分别表示统计这个物品或不统计这个物品.
- 从前往后统计物品,即遍历赋值 \(1\) .
- 记录上一个和当前物品种类相同的物品在哪里,假如我们统计了当前物品,就把上一个相同种类的物品置 \(0\) .
- 区间 \([i,j]\) 内的物品种类数即为 \(sum(i,j)\).
但是这样做有一个问题,假如上一个相同种类的物品在区间内,但是当前这一个不在. 那么我们统计时,这个物品种类已经置 \(0\) , 就会出现错误.
离线
综上,我们现在需要解决一个问题:
统计当前区间时,这个区间内的物品既不能未统计,也不能已置 \(0\) .
我们可以这样解决:
- 记录每个区间的右端点,并从小到大排序.
- 取出一个最小的右端点,若当前对物品的遍历到达了这个右端点,那么马上算出答案并存储.
- 重复上述步骤.
这样一来,因为置 \(0\) 影响到的区间已经被事先算出来了,所以丝毫没有受到影响.
事实上,我们用到了一种算法思想即离线算法:先存储所有问题,待全部询问结束后再全部输出.
细节处理
1. 关于区间遍历
我们可以开一个变量 \(now\) 作为指针来记录当前遍历到的区间,若答案被算出,则 \(now++\) . 考虑到有右端点重复的区间,因此我们的写法如下:
while(a[now].r==i){
算出答案并存储;
now++;
}
2. 关于答案存储
我们可以给区间开一个结构体,这个结构体里除了有区间的左右端点之外,还有一个区间的询问顺序编号. 按这个编号,我们可以做到有序输出.
代码实现
注:本代码使用 封装树状数组
BIT t;
int s[1000001],fore[1000001],ans[1000001]; //s为原序列,fore记录了上一个相同种类的序号,ans记录答案
struct area{
int l,r,id;
bool operator <(const area &A)const{
return r<A.r;
}
}a[1000001];//记录区间
int n,anow=1,m;
int main(){
cin>>n;
t.n=n;
for(int i=1;i<=n;++i){
cin>>s[i];
}
cin>>m;
for(int i=1;i<=m;++i){
cin>>a[i].l>>a[i].r;
a[i].id=i;
}
sort(a+1,a+m+1);
for(int i=1;anow<=m&&i<=n;++i){
t.change(i,1);
if(fore[s[i]]){
t.change(fore[s[i]],-1);
}
fore[s[i]]=i;
while(a[anow].r==i){
ans[a[anow].id]=t.sum(a[anow].l,a[anow].r);
anow++;
}
}
for(int i=1;i<=m;++i){
cout<<ans[i]<<endl;
}
}
[TK] HH的项链 离线树状数组解法的更多相关文章
- P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- BZOJ 1878: [SDOI2009]HH的项链 离线树状数组
1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 【洛谷P1972】HH的项链 离线+树状数组
题目大意:静态查询序列区间颜色数. 题解:对于一个查询区间 [l , r] ,若有两个相同颜色的点在这个区间中,则总是取下标靠近端点 r 的颜色计入答案贡献.对于每个下标,记录下在这个下标之前,且距离 ...
- 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)
传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...
- 【BZOJ】1878: [SDOI2009]HH的项链(树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1878 我太弱了,看题解才过的. 一开始看到此题,我想了想在线做法,但之后觉得这个想法可能是错的:维护 ...
- 洛谷P1972 [SDOI2009]HH的项链(树状数组)
题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...
- bzoj 1878: [SDOI2009]HH的项链【树状数组】
对于一个lr,每个颜色贡献的是在(1,r)区间里出现的最右位置,所以记录一个b数组表示当前点这个颜色上一个出现的位置 然后把询问离线,按r升序排序 每次把右端点右移,把这个点在树状数组上+1,并且在当 ...
- [BZOJ1878][SDOI2009] HH的项链 (树状数组)
link 一道简单题. 不用可持久化. 对于统计颜色个数,可以看与其颜色一样的前一个位置. 设$las(i)$表示其与$i$颜色相等的上一个位置. 则对于二元组$(l,r)$,其答案为$\sum_{i ...
- [bzoj1878][SDOI2009]HH的项链_树状数组
HH的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列,m次查询.查询区间数的种类个数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 2\ ...
- BZOJ 1878 HH的项链(树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1878 题意:给出一个数列,每次询问区间[L,R]中有多少个不同的数字? 思路: (1)记 ...
随机推荐
- Excel VBA编程常用语句300句
定制模块行为 1. Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Opt ...
- 学习笔记--Java方法重载
Java方法重载 感受 以下代码不使用"方法重载",不使用overload,分析程序存在的缺点 public class OverloadTest01 { // 入口 public ...
- CRC 循环冗余效验
CRC循环冗余效验 利用多项式 x6 + x4 + x3,实际为使用模2除法来做的加密 常用crc多项式有 名称 生成多项式 数值式 简记式 标准引用 CRC-4 x4+x+1 0x1'3 0x3 I ...
- 制作KubeVirt镜像
目录 制作KubeVirt镜像 1. 准备磁盘文件 2. 编写Dockerfile 3. 构建镜像 4. 上传镜像到仓库(可选) 5. 导出镜像 6. 虚拟机yaml文件 7. 启动虚拟机 8. 启动 ...
- 亚马逊 vpc 子网 路由表 互联网网关 弹性ip
创建vpc,子网,路由表,互联网网关,弹性ip等网络资源 vpc和子网 创建互联网网关 附加到vpc 创建路由表 路由表编辑路由 此路由通过这个网关出去 编辑子网关联 保存关联 有关云主机 创建属于那 ...
- 【Java】三元运算符 类型提升 问题
代码片段: @Test public void test() { Object o = true ? new Integer(1) : new Double(2); System.out.printl ...
- 【MongoDB】Re01 安装与基础操作
Linux安装 官网下载红帽安装版 #下载三个rpm包 wget https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el7-4.2/RPMS/mongo ...
- 【Win10】找不到Telnet命令
百度才发现原来我的Telnet程序就没启动... CMD终端就找不到命令... 但是有一点要注意!不能使用CMD之外的终端访问[GitBash访问无效] 打开控制面板,点卸载程序: 然后点击启动和关闭 ...
- pyqt报错、python报错:src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录
报错信息: -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /home/devil/anaconda3/envs/91/include -fPIC -O2 ...
- 清华镜像源、阿里镜像源全部失效后怎么办 —— conda 服务器代理配置 —— Jax框架的安装
相关: conda 服务器代理配置 最近在用anaconda安装Jax框架,发现直接使用官方源下载的速度十分的慢,估计要需20个小时才能下载完成,对于这种情况第一个感觉就是使用镜像源来进行下载. 但是 ...