SP3267 DQUERY - D-query (主席树)

简介: SP3267 DQUERY - D-query (主席树)

link

题意:

求区间出现的不同数字的种类数

思路:

方法有很多,莫队分块树状数组

对于主席树:

如果该元素第一次出现,直接将对应线段树的位置+ 1

反之,先将上一次出现的位置− 1,再将该位置+ 1

代码:

const int maxn=3e5+7,mod=1e9+7,inf=0x3f3f3f3f;
int a[maxn],n,q;
int root[maxn],idx;
struct node{
  int l,r,cnt;
}tr[maxn*40];
void pushup(int u){
  tr[u].cnt=tr[tr[u].l].cnt+tr[tr[u].r].cnt;
}
int build(int l,int r){
  int p=++idx;
  if(l==r){
    tr[p].cnt=0;
    return p;
  }
  int mid=(l+r)/2;
  tr[p].l=build(l,mid);
    tr[p].r=build(mid+1,r);
    pushup(p);
    return p;
}
int nsert(int k,int l,int r,int u,int val){
  int p=++idx;
  tr[p]=tr[u];
  if(l==k&&k==r){
    tr[p].cnt+=val;return p;
  }
  int mid=(l+r)/2;
  if(k<=mid) tr[p].l=nsert(k,l,mid,tr[p].l,val);
  else tr[p].r=nsert(k,mid+1,r,tr[p].r,val);
  pushup(p);
  return p;
}
int query(int l,int r,int u,int pos){
  if(l==r) return tr[u].cnt;
  int mid=(l+r)/2;
  if(pos<=mid) return tr[tr[u].r].cnt+query(l,mid,tr[u].l,pos);
  else return query(mid+1,r,tr[u].r,pos);
}
int main(){
  n=read;
  rep(i,1,n) a[i]=read;
  root[0]=build(1,n);
  map<int,int>mp;
  rep(i,1,n){
    if(!mp[a[i]]){
      mp[a[i]]=i;
      root[i]=nsert(i,1,n,root[i-1],1);
    }
    else{
      int tmp=nsert(mp[a[i]],1,n,root[i-1],-1);
      root[i]=nsert(i,1,n,tmp,1);
    }
    mp[a[i]]=i;
  }
  q=read;
  while(q--){
    int l=read,r=read;
    printf("%d\n",query(1,n,root[r],l));
  }
}
/**
 * root[i]维护的是数组[1,i]中每个数的最后位置
这样查询 [ l , r ] 内的答案就是查询第 r 个版本的主席树中 [ l , r ] 的 sum
 * */
目录
相关文章
|
7月前
|
Java
开发指南004-@Query参数写法
JPA的Query注解和函数参数的绑定有多种写法
SP10707 COT2 - Count on a tree II(欧拉序 树上莫队)
SP10707 COT2 - Count on a tree II(欧拉序 树上莫队)
115 0
SP10707 COT2 - Count on a tree II(欧拉序 树上莫队)
|
SQL 移动开发 测试技术
SQL Challenge &mdash;&mdash;快速找到1-100之间缺失的数
有个经典的题目:1-100之间的数字(不重复)存放在表里,共95行一列,但是里面缺了5个数字,怎么用SQL最快找出那五个数字。   我们先来看看Oracle数据库如何实现,如下所示,我们先准备测试环境和数据。
1437 0
|
SQL 测试技术 索引
SQL性能调优实践&mdash;&mdash;SELECT COUNT
最近想深入学习SQL,在网上搜索到一些SQL 优化的资料要么是张冠李戴,Oracle 优化的资料硬是弄成啦MS SQL 优化的资料,而且被很多人转载,收藏,有些要么有些含糊不清,好像是那么回事,也没经过验证,实践出真知!下面是我对SELECT COUNT(*), SELECT COUNT(1),SELECT COUNT (0), SELECT COUNT(Field)等孰优孰劣的测试结果,如果测试方法有什么不足,也希望大家给点建议。
1330 0
|
SQL 数据库 索引
SQL Server使用sp_spaceused查看表记录存在不准确的情况
SQL Server使用sp_spaceused查看表记录存在不准确的情况在之前写过一篇博客"关系数据库如何快速查询表的记录数",里面介绍了使用sp_spaceused查看表的记录数是否正确的问题,具体如下: 关于问题3:有多个索引的表,是否记录数会存在不一致的情况? 答案:个人测试以及统计来看,暂时发现多个索引的情况下,sys.partitions中的rows记录数都是一致的。
1012 0
|
SQL 算法 测试技术
SELECT TOP 1 比不加TOP 1 慢的原因分析以及SELECT TOP 1语句执行计划预估原理
原文:SELECT TOP 1 比不加TOP 1 慢的原因分析以及SELECT TOP 1语句执行计划预估原理   本文出处:http://www.cnblogs.com/wy123/p/6082338.
1000 0
|
SQL 算法 数据库
小心SQL SERVER 2014新特性&mdash;&mdash;基数评估引起一些性能问题
原文:小心SQL SERVER 2014新特性——基数评估引起一些性能问题     在前阵子写的一篇博文“SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享”里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER 2014后,发现一个SQL出现性能问题,当时分析后发现执行计划变了,导致SQL出现了性能问题。
1144 0
|
SQL Oracle 关系型数据库
[20180320]toad环境中一次fetch等于多少
[20180320]toad环境中一次fetch等于多少.txt --//上午重新看了以前写的一篇文章,链接:http://blog.itpub.net/267265/viewspace-2150845/ --//里面提到toad.
1082 0
|
SQL 数据库
简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录
原文:简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录        在很多的时候,我们会在数据库的表中设置一个字段:ID,这个ID是一个IDENTITY,也就是说这是一个自增ID。
1767 0