博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ3267/DQUERY:D-query——题解
阅读量:6814 次
发布时间:2019-06-26

本文共 1490 字,大约阅读时间需要 4 分钟。

给定一列数,查询给定区间内数的种类数。

这题可以分块做:

但是我们不想分块而且垃圾SPOJ可能会卡时间同时又想练主席树,所以选择主席树。

参考:

这种题的主席树建法并不是权值线段树,而是正常线段树。

当我们建树过程中碰到的重复的数的时候,显然让该重复的数接近r是最好的,所以我们把前面的数删掉,放到后面。

查询的时候就是查询rt[0]~rt[r],并且查询的范围在l~r的数的个数即可。

PS:rt[0]相当于没有,范围的上限r也可以省略。

#include
#include
#include
#include
#include
#include
using namespace std;const int N=1e6+5;inline int read(){ int x=0,w=1;char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*w;}struct tree{ int l,r,sum;}tr[N*20];int n,m,rt[N],pool,in[N];inline void insert(int y,int &x,int l,int r,int p,int v){ tr[x=++pool]=tr[y]; tr[x].sum+=v; if(l==r)return; int mid=(l+r)>>1; if(p<=mid)insert(tr[y].l,tr[x].l,l,mid,p,v); else insert(tr[y].r,tr[x].r,mid+1,r,p,v);}inline int query(int x,int l,int r,int p){ if(p<=l)return tr[x].sum; if(r
>1; return query(tr[x].l,l,mid,p)+query(tr[x].r,mid+1,r,p);}int main(){ n=read(); for(int i=1;i<=n;i++){ int a=read(),tmp; if(!in[a]){ insert(rt[i-1],rt[i],1,n,in[a]=i,1); }else{ insert(rt[i-1],tmp,1,n,in[a],-1); insert(tmp,rt[i],1,n,in[a]=i,1); } } m=read(); for(int i=1;i<=m;i++){ int l=read(),r=read(); printf("%d\n",query(rt[r],1,n,l)); } return 0;}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8707573.html

你可能感兴趣的文章
Python基础6-1 面向对象编程
查看>>
邮箱服务器DNS BLACKLIST过滤SMTP
查看>>
ActiveMQ学习笔记(3)——ActiveMQ的安装
查看>>
OSI(Open System Interconnection)网络7层模型
查看>>
Blat-windows cmd命令行脚本SMTP模式发邮件的开源工具参数详细说明
查看>>
25匹马取前5,每次只能比5匹
查看>>
使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
查看>>
linux rhel6 搭建RSYNC 差异备份详解
查看>>
mysql语句大全
查看>>
ssh执行sudo命令所遇到的错误解决
查看>>
攻克要塞 - 冲刺题目下载
查看>>
SSH登录-bash:/etc/profile Permission Denied 报错,root登录正常
查看>>
Retrofit2 再次封装(API not restful)
查看>>
OMF方式管理(2)
查看>>
AIX学习之--文件系统修复(/home)
查看>>
10个趣味Linux动画命令
查看>>
android环境搭建
查看>>
Controller增强,全局异常处理类
查看>>
Docker镜像与仓库
查看>>
Linux基础--进程管理相关命令介绍(2)
查看>>