SPOJ D-query 区间不同数的个数 [在线主席树 or 离线树状数组]

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

题意:给出N个数,M个询问,每次询问给出区间内不同数的个数。

解法:很经典的题目,可以将每一个数依次插入主席树,插入时,将这个位置+1,并将最近的一个等值的位置-1即可。然后对于询问区间L,R,只要在第R颗树上询问区间L,R的和就是答案。类似于这个思想,可以考虑离线处理询问,从左往右遍历插入,处理所有以这当前点为右端点的询问,这样就不需要可持久化了,并且树状数组就可以轻松维护了。

主席树代码:


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)
#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

#define lowbit(x) (x&(-x))

#define N 230030
#define M 5005000
int tot,c[M],lson[M],rson[M];
int t[N],n,qn,a[N],b[N],bn;
int nxt[N];


int build(int l,int r){
    int x=++tot;
    c[x]=0;
    if(l!=r){
        int m=(l+r)>>1;
        lson[x]=build(l,m);
        rson[x]=build(m+1,r);
    }
    return x;
}
void update(int l,int r,int pos,int pre,int cur,int val){
    lson[cur]=lson[pre];
    rson[cur]=rson[pre];
    c[cur]=c[pre]+val;
    if(l==r)return;
    int m=(l+r)>>1;
    if(pos<=m)update(l,m,pos,lson[pre],lson[cur]=++tot,val);
    else    update(m+1,r,pos,rson[pre],rson[cur]=++tot,val);
}
int query(int th,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return c[th];
    int sum=0;
    int m=(l+r)>>1;
    if(m>=ql)sum+=query(lson[th],l,m,ql,qr);
    if(m<qr)sum+=query(rson[th],m+1,r,ql,qr);
    return sum;
}
int main(){
    scanff(n);
    t[n+1]=build(1,n);
    rep(i,1,n)scanff(a[i]),b[++bn]=a[i];
    sort(b+1,b+1+bn);
    bn=unique(b+1,b+1+bn)-b-1;
    rep(i,1,n)a[i]=findx(a[i]);
    rep(i,1,bn)nxt[i]=-1;
    drep(i,n,1){
        t[i]=++tot;
        if(nxt[a[i]]==-1){
            update(1,n,i,t[i+1],t[i],1);
        }
        else{
            update(1,n,nxt[a[i]],t[i+1],t[i],-1);
            int temp=++tot;
            update(1,n,i,t[i],tot,1);
            t[i]=temp;
        }
        nxt[a[i]]=i;
    }
    scanff(qn);
    rep(i,1,qn){
        int l,r;
        scanff(l);scanff(r);
        printf("%d\n",query(t[l],1,n,l,r));
    }
    return 0;
}

离线树状数组代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)
#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define lowbit(x) (x&(-x))

#define N 30030
#define M 200200
int n,qn;
int nxt[N];
int a[N],b[N],c[N],bn;
struct query{
    int l,r,idx;
    bool operator < (const query temp)const{
        return r<temp.r;
    }
}q[M];
int ans[M];


int add(int x,int val){
    for(int i=x;i<=n;i+=lowbit(i))
        c[i]+=val;
}
int getsum(int l,int r){
    int suml=0,sumr=0;
    for(int i=l-1;i;i-=lowbit(i))suml+=c[i];
    for(int i=r;i;i-=lowbit(i))sumr+=c[i];
    return sumr-suml;
}

int main(){
    scanff(n);
    rep(i,1,n)scanff(a[i]),b[++bn]=a[i];
    sort(b+1,b+1+bn);
    bn=unique(b+1,b+1+bn)-b-1;
    rep(i,1,n)a[i]=findx(a[i]);
    scanff(qn);
    rep(i,1,qn){
        scanff(q[i].l);
        scanff(q[i].r);
        q[i].idx=i;
    }
    sort(q+1,q+1+qn);
    int j=1;
    rep(i,1,n){
        if(nxt[a[i]])add(nxt[a[i]],-1);
        add(i,1);
        while(q[j].r==i&&j<=qn){
            ans[q[j].idx]=getsum(q[j].l,q[j].r);
            j++;
        }
        nxt[a[i]]=i;
    }
    rep(i,1,qn)printf("%d\n",ans[i]);
    return 0;
}


常见的电容有哪些 电容在电路板中非常常见,类别纷繁复杂,本文化繁为简,主要介绍下常见电容。 阅读详情

相关推荐

物体检测之非极大值抑制:NMS、softNMS、softerNMS、IoU-Net

当前的物体检测算法为了保证召回率,对于同一个真实物体往往会有多个的候选框输出。由于多余的候选框会影响检测精度,因此需要利用NMS过滤掉重叠的候选框,得到最佳的预测输出。当前有如下几种较为常见的NMS方法, 1.基本NMS 非极大值抑制, 顾名思义就是抑制不是极大值的边框,这里的抑制通常是直接去掉冗余的边框。 这个过程涉及以下两个量化指标: 1.预测得分:NMS假设一个边框的预测得分越高,这个框...

LeoLee 1944

【蓝桥杯——区间不同数】

今天的出题与解题就到这里辣,有不会的小伙伴们可以评论区发表意见,我会一一解答哦!如果您觉得小编写的还可以或者还有哪些地方需要改进的话评论区留言好嘛!

pqjyyds的博客 264

【浅读论文-红外和可见光图像融合-CNN】Infrared and Visible Image Fusion using a Deep Learning Framework

1.这篇是2018年ICPR会议上发表的一篇文章1。博主个人觉得这算比较早期在VIF(红外光和可见光图像融合)中加入了深度学习这一模型的论文。2.这篇文章并不是完全使用深度学习的模型,模型主体在图像分解和融合仍然采用传统的方法,只有其中一个分支在特征提取和重建方面用到了VGG网络。3.论文地址4.代码地址本文提出了基于深度学习框架的一种新算法。本文提出使用下述论文中Image fusion with guided filtering2中的分解方法将源图像分解为基本部分和细节内容。

一枚博鼠的博客 1708

牛客第一场J题 题解

题目大意是给出n个数,对于每次查询(l,r),求出(1,l)和(r,n)两个区间不同的数有几个。    第一步,先考虑把两个区间的问题,化成一个区间内不同数的个数:     把原数组复制一遍贴到原数组的末尾,这样数组长度变成2n,查询区间变成了(r,n+l)。  接着,对于如何求一个区间内不同数的个数,可以使用树状数组进行维护。看得懂模板,会使用即可。   有关树状数组:https://b...

qq_40980489的博客 194

obdumper和obloader迁移OceanBase业务库(一):实施手册

⭐️ 要求导出一致性数据时,建议在导出数据前,手动触发一次合并,在合并成功后再重新导出数据。:统计业务数据库下的所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…:检查业务数据库下的所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…:统计单个模式下所有业务对象清单(表/索引/分区/包/存储过程/同义词/序列/…如果单张表的数据量太大,会导出为多个文件,文件命名会加上数字后缀。该过程会导出所有表的定义、以及定义在表上的索引定义。如果有多种数据库对象,会导出到不同的子路径下。

Sebastien23的博客 1024

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

算法大师! 671

spoj D-query 区间不同数个数 主席树||离线+树状数组

把区间统计转化为前缀和,这里的前缀和不是普通的前缀和,对相同的ai,只有最右边那个才是有效的。 举个栗子:1 2 2 1 3 这样一个序列有效是这个样子 * * 2 1 3 ,因为1在后面出现过所以前一个无效,同理 2。前缀和则是0 0 1 2 3 ,那么对区间[1,5],[2,5],[3,5],[4,5],..[x,5] 我们都可以用sum[5]-sum[x-1]来求。 这里的一个问题是前缀

varinic 的博客 2436

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集

YOLOv5入门实践第2步,手把手教你使用labelimg标注数据集

路人贾的博客 1万+

SPOJ DQUERY - D-query(主席树-区间不同数的个数)

大体题意: 给你n 个数,给你q个询问,每个询问问你某个区间上不同数的个数是多少? 思路: 主席树入门题: 简单记录一下: 这里先建立一个完整的线段树,这里的区间就代表区间了,不再是第几大了, 定义的sum 是这个区间上的不同数的个数有几个。 因为是主席树嘛,所以肯定要建立n 棵线段树,每个线段树是以每个位置的数为根,比如说该建立第i 个线段树了,如果这个数字之前没有出现过,那么我们

aozil_yang的博客 4147

数美device_fingerprint、device_id、hmac生成

device_fingerprint、hmac、device_id参数分析与解读

吴秋霖的博客 2881

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1384

D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

English Vietnamese Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct...

starlet_kiss的博客 1325

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

D-query SPOJ - DQUERY 区间不同数的个数(离线树状数组)

Given a sequence of n numbers a1, a2, ..., anand a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the ...

孤风的博客 291

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SPOJ 3267(DQUERY) D-query 【主席树】【离线树状数组】

题目链接 persistent segment tree 题意 给一串数列,有q个(1e5的数量级)询问,求i到j间的不同数字的个数 分析 这个题有几种做法,可以用主席树、离线树状数组,还可以直接用莫队。这里写一下主席树和离线树状数组的做法 主席树做法 若用线段树,父子节点之间存的状态不好合并,这时先考虑一个简化的问题:对于一个序列,它的某个...

babao9492的博客 210

SPOJ - DQUERY D-query (主席树)

题目链接:http://www.spoj.com/problems/DQUERY/en/点击打开链接 DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and a numbe

xuejye的博客 1035

SPOJ 3267 DQUERY(主席树在线|树状数组离线)

 题意:给定n个数,m个询问,每次回答某个区间内不相同的元素个数。 思路:这道题很像之前hdu上做过的一道 http://blog.youkuaiyun.com/u014664226/article/details/47307779 这是用树状数组离线做的,将询问排序,从头扫一遍,将将当前元素上次的出现的位置减一,本次出现的位置加一,如果该点有询问,记录答案。 今天学习了主席树,又用主席树做了一遍

GODSPEED 1700

SPOJ DQUERY - D-query [树状数组+离线 || 主席树 ]【数据结构】

题目连接:http://www.spoj.com/problems/DQUERY/—————————————————————————————————————————— DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, …, an and a number of d

Tabris的博客 548

DQUERY - D-query——(主席树求区间不同数总个数)

题目链接:https://vjudge.net/problem/spoj-dquery 求区间不同数的总个数 n个数,数组a1...an,m次询问,区间al....ar中区间数的种数的总量 5 1 1 2 1 3 3 1 5 2 4 3 5 3 2 3 主席树: 每颗线段树存每个点最后出现的位置,答案等于当前线段树的区间和 离线求法: 对于求区间l~r的答案,等于1~...

creator平 309

SPOJ DQUERY树状数组离线or主席树

D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status Description English Vietnamese Given a sequence of n nu

阳光下的泡沫 771

SPOJ3267——D-query(主席树)

题意: 输入N个数字,查询区间[L,R]中有多少个不同的数字 思路: 主席树 每个位置上保存一个值。保存每个数的位置信息,如果这个数没有出现过,当前位置+1,如果出现过,将之前出现的位置-1,当前位置+1 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...

CY05627的博客 293

SPOJ 3267. D-query (主席树or树状数组离线)

A - D-query Time Limit:1500MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ DQUERY Appoint description:  System Crawler  (2014-12-06) Description

u013268685的专栏(有一种幸福叫AC,有一种期待叫AK) 1944

D-query SPOJ - DQUERY (树状数组离线预处理||主席树)

Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the sub

退役的铜牌狗 472

SPOJ D-query 树状数组离线&&主席树在线

Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the sub

I good vegetable a! 498

[SPOJ 3267] D-query (主席树入门)

SPOJ - 3267 给定一个序列,询问区间内有多少个不同的数 这题有离线询问+树状数组的解法 这里是主席树的在线解法 基本思路和离线的一样,只不过在线了一下 能离线还是离线比较好#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <iostream> #include <cst

MisDeer's blog 645

SPOJ3267 D-Query 树状数组离线操作 或 主席树 查询某一区间内有多少不同的数

D-Query 看的网上的,不甚理解。代码中有注释。维护树状数组C[i], sum(x)指 A[1:x]中有几个不同的数字 DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pai

zzu::myorange 581
上一篇: HDU 4348 / SPOJ TTM To the moon [主席树]
下一篇: ZOJ 2112 Dynamic Rankings [树状数组套主席树]
GrassTreeFlower
博客等级 码龄11年 14粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值