SPOJ DQUERY 区间内不同数的个数

RandLA-Net复现SemanticKITTI和S3DIS数据集 RandLA-Net复现KITTI和室内数据集 阅读详情

题目:给你n个数,m个询问,问区间[L,R]内的不同数的个数

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define PI acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
// 0x3f3f3f3f


const int maxn=1e5+50;
const int maxm=maxn*30;
int arr[maxn];//原数组
int root[maxn],lson[maxm],rson[maxm],cnt[maxm];//根节点,左儿子,右儿子,区间内的数出现次数的前缀和
int tot,n;
void init(){
    tot=1;
    root[0]=lson[0]=rson[0]=cnt[0]=0;//建一棵空树
}
int update(int rt,int pos,int val){
    int newrt=tot++,temp=newrt;
    cnt[newrt]=cnt[rt]+val;
    int l=1,r=n;
    while(l<r){
        int mid=(l+r)/2;
        if(pos<=mid){
            r=mid;
            lson[newrt]=tot++;rson[newrt]=rson[rt];
            newrt=lson[newrt];rt=lson[rt];
        }
        else{
            l=mid+1;
            lson[newrt]=lson[rt];rson[newrt]=tot++;
            newrt=rson[newrt];rt=rson[rt];
        }
        cnt[newrt]=cnt[rt]+val;
    }
    return temp;
}
int query(int rt,int pos){
    int l=1,r=n;
    int res=0;
    while(l<r){
        int mid=(l+r)/2;
        if(pos<=mid){
            r=mid;
            res+=cnt[rson[rt]];
            rt=lson[rt];
        }
        else{
            l=mid+1;
            rt=rson[rt];
        }
    }
    res+=cnt[rt];
    return res;
}
map<int,int> mp;
int main(){

    int m,L,R;
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++)
            scanf("%d",&arr[i]);
        init();
        mp.clear();
        for(int i=1;i<=n;i++){
            if(mp.count(arr[i])){
                root[i]=update(root[i-1],mp[arr[i]],-1);
                root[i]=update(root[i],i,1);
            }
            else
                root[i]=update(root[i-1],i,1);
            mp[arr[i]]=i;
        }
        scanf("%d",&m);
        while(m--){
            scanf("%d%d",&L,&R);
            int ans=query(root[R],L);
            printf("%d\n",ans);
        }
    }
    return 0;
}


MicroChip的SmartFusion2的M2S090芯片的全流程开发环境搭建和Demo设计 阅读详情

相关推荐

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 647

快速求多个区间内的不同数的数量

这个操作就是为了消去前面有相同的数时,对答案的贡献会有问题。这样正确是因为对于相同的数,越靠近右边的越可能对答案有贡献。先将所有的区间存在结构体中,然后按照区间右端点的值从小到大排序。此后,从第一个线段开始枚举,同时。这个数之前出现过,即。最后当前区间的答案即。

Rainbow_Cat_M的博客 1436

OpenClaw安装方式那么多,但建议大家还是用云厂商吧

OpenCloud的安装方式多样,包括One-liner、npm、pnpm和Hackable等。One-liner提供高效的单行命令安装;npm和pnpm作为Node.js包管理工具,分别提供常规和高性能的安装选项;Hackable则支持定制化安装。不同系统(macOS、Windows)和终端(PowerShell、CMD)的操作步骤各有特点,用户需根据自身技术背景选择合适的安装方式。官方推荐使用闲置计算资源或云部署方案以获得更佳体验。

涛涛讲AI 1398

求区间不同数字的个数和和

1 Byte = 8 Bit 1 KB = 1,024 Bytes 1 MB = 1,024 KB = 1,048,576 Bytes 一个int是4字节即4Byte. 求个数和求和类似,不过是在更新的时候把1变成了这个数的值,下面就讲讲求区间不同数字的个数。 首先我们思考对于右端点固定的区间(即R确定的区间),我们如何使用线段树来解决这个问题。 我们可以记录每个数字最后一次出现的位置。比...

SEIZE THE DAY 2366

WPS接入DeepSeek,实现AI辅助功能

总的来说,借助 WPS 中宏功能与 DeepSeek 大模型的结合,文档处理、内容创作和数据分析等任务都能更加智能化、自动化。这不仅大幅提升了工作效率,也为办公场景带来了全新的智能化办公体验。

运维老生常谈 3803

把 300 亿参数的 Qwen3-30B-A3B 塞进 16GB 手机:MoE、mmap 与内存轮转的完整拆解

这篇文章详细拆解了如何在16GB内存手机上运行305亿参数的Qwen3-30B-A3B大模型。作者通过MoE(专家混合)架构、内存映射(mmap)和专用NPU内存(rpcmem)的巧妙结合实现了这一"不可能"的任务。 核心原理在于:MoE模型将庞大的前馈网络拆分为128个专家,每个词只激活8个专家,97%的权重处于闲置状态;通过mmap技术按需加载当前需要的专家权重;同时利用NPU专用内存高效计算关键部分。三个关键开关(GGML_HEXAGON_MOE_PAGING=1、--mmap、GGML_CPU_RE

q742971636的博客 185

统计各位数字都不同的数字个数 II

给你两个a和b,返回[a, b]内各位数字都不同的数字个数。19除 11 以外,区间 [1, 20] 内的所有数字的各位数字都不同。因此,答案为 19。10除 11 以外,区间 [1, 20] 内的所有数字的各位数字都不同。因此,答案为 10。27区间 [80, 120] 内共有 41 个整数,其中 27 个数字的各位数字都不同。

icbbm的博客 424

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(2)- 核心控制消息;会话管理;测距会话管理

测距是UWB最核心的应用。为了方便应用调用测距接口,FIRA统一了UCI命令格式,这样各个厂商可以互相兼容。

Ankie资深技术项目经理 1276

主席树求区间内不同数字的个数

主席树求区间内不同数字的个数 例题:[SDOI2009]HH的项链(然而我的主席树无论如何都会被加强的数据卡到72分) 题目搬运: HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝...

weixin_30561177的博客 394

C#与硬件开发入门:从零开始搭建你的第一个硬件项目

《C#硬件开发入门指南》摘要:本文介绍了使用C#进行硬件开发的基础知识,重点讲解了通过串口通信控制硬件设备的实现方法。内容包括:C#硬件开发优势、必备基础知识、环境准备步骤,并提供了一个完整的串口数据读取示例代码。文章还给出了进阶学习建议和常见问题解决方案,帮助开发者快速掌握C#与硬件设备通信的基本技能,为进一步开发物联网、工业控制等应用打下基础。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 973

STM32F4 SPI FLASH(W25Q128)驱动详解(含DMA+完整读写擦除+低功耗)

本文实现了一款基于STM32 HAL库的SPI Flash驱动,以W25Q128为例,提供了完整的初始化、读写、擦除、ID读取等功能。驱动集成了DMA传输、超时保护、页对齐写入等特性,支持扇区擦除、整片擦除、页写入及跨页缓冲写入。代码结构清晰,易于移植到其他SPI Flash型号(如W25Q64、W25Q16等),适用于数据存储、固件升级、文件系统等嵌入式场景。

kevin1499的博客 96

求区间不同数的个数

在线做法:(主席树) 参考自:https://blog.youkuaiyun.com/aozil_yang/article/details/65448883 对于每一颗线段树我们只保留到目前为止每个数字最后出现的位置,即对于第k棵线段树我们将区间[1,K]中每个数字最后出现的位置处标记为1,之前的为0。 即若到目前为止序列从1到n出现的数字为:1,1,2,3,2,4的话,第六颗线段树是在这样的一个...

cy41的博客 3990

Agent应用实践之二十九 - 设计模式:人机协同

本章讲解了一种比较常见的设计模式:人机协同。通过一些场景举例,同时使用AgentScope本身自带的能力实现的人机协同模式,最后通过源码分析了AgentScope中如何实现。通过了解人机协同模式对于实际工程使用也是非常有用的。

代码让AI扣 305

【SPOJ - DQUERY】D-query【主席树 —— 区间中不同数的个数】

题意: 长度为nnn的序列,qqq次询问,每次给出lll、rrr,返回序列[l,r][l,r][l,r]中不同数的个数。(1≤n≤3∗104,1≤q≤2∗105)(1\leq n\leq 3*10^4,1\leq q\leq 2*10^5)(1≤n≤3∗104,1≤q≤2∗105) 思路: 与之前主席树的权值线段树思路不同,此题的思路是建立nnn颗线段树,第iii颗线段树存储区间[1,i][1,...

lucius-liu.cn 1740

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

题目链接:https://vjudge.net/problem/SPOJ-DQUERY 题目大意:给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数。 解题思路:从左向右一个一个将该数字处在的位置添加到主席树中 如果该数字前面未出现过,则在此版本的线段树中的该条链加1,如果该数字已经出现过了,则在此版本线段树的上次出现位置减1,再在此版本线段树的该位置...

weixin_30662849的博客 174

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

aozil_yang的博客 4146

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SPOJ DQUERY 求区间内不同数的个数 (主席树)

DQUERY - D-queryGiven 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 ele

阿柟喜欢吃小星星? 641

spoj - DQUERY (区间内不同数的个数 主席树 在线)

题意: 给n,然后给长度为n的数组 各m,表示m各询问 每个询问给L,R,输出L到R中不同数字的个数 分析: 和用树状数组解差不多,每次插入数字的下标,插入前判断数字之前是否出现过,如果出现过,就删除之前的然后再添加新的 ps: 第一次见到一棵树修改超过一次的题 code: #include<cstdio> #include<cstring> #include<ios...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 210

SPOJ3267 DQUERY (主席树 求区间内不同数的个数 )

题意: 给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数。 思路: 从左向右一个一个将该数字处在的位置添加到主席树中 如果该数字前面未出现过,则在此版本的线段树中的该条链加1,如果该数字已经出现过了,则在此版本线段树的上次出现位置减1,再在此版本线段树的该位置加1,这样就能保证区间不重复计算。 #include<bits/stdc++.h> ...

Ordinarv 323

SPOJ DQUERY 区间不同数的个数(在线主席树+离线树状数组)

题目链接:SPOJ - DQUERY:https://www.spoj.com/problems/DQUERY/en/ 题目: 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 (...

pxlsdz的博客 353

SPOJ DQUERY 求区间内不同数的个数 主席树

这题跟HDU3333差不多吧。 离线的做法很简单,不再说了 以前做过。 主席树的做法就比较暴力了。。 什么是主席树呢。。 其实是某种称号。 在该题中的体现是可持久化的线段树。 对于一个数 如果以前没出现过 就插入到主席树中 否则就删除以前那个。 再插入主席树。 注意,所有的更新和删除都是建立了新的节点来保持其历史状态的。。 对于T[i]我们存的是从

水 4783

SPOJ DQUERY 区间内不同数的个数 主席树

#include #include #include #include #include using namespace std; const int MAXN = 30010,MAXLOG = 20; struct ChairTree { int l,r; int ans; }ct[MAXN*MAXLOG]; int ctRoot[MAXN]; int ctTop

自在飞花 1031

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

题意 给出n个数,m个询问,每个询问给出一个区间,需要回答这个区间中不同的数的个数 题目 {assign var=“code” value=“DQUERY”} {if KaTeX parse error: Expected 'EOF', got '}' at position 8: par==""}̲ {assign var=pa…locale} {/if} English Vietnamese ...

zeng_jun_yv的博客 415

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

题意:问你区间有几个不同的数 思路:主席树nb。我们知道主席树每一个root都存着一棵权值线段树,现在我们在每个root中存位置,也就是01表示这个位置存不存在。然后我们用一个fa[a[i]]表示a[i]这个数在前面出现的位置。如果没有在前面出现过,那么我们直接把这个位置变成1,;如果出现过了,我们就把当前root节点下的线段树的fa[a[i]]位置减掉。也就是说我每个数字存在的位置现在只出现当...

weixin_34293141的博客 199

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 ...

孤风的博客 290

SPOJ DQUERY(树状数组离线处理 or 主席树 区间不同数个数)

题意:n个数,m个询问,问区间[l, r]中有多少个不同的数。 思路: 树状数组:先将所有查询按区间右端点从小到大排序,如果一个数已经出现过就先把以前位置上的删掉然后在新的位置上插入,这样[l,r]中重复的就只计算了一次 。 主席树:因为主席树同时维护好多树,所以可以在线上解决,思路与树状数组基本一模一样,如果这个数出现过,就在上次出现的地方删去,在这重新添加。 树

CillyB的博客 1064
上一篇: hdu4348 To the moon 区间更新
下一篇: HUST - 1017 精确覆盖
我不会额
博客等级 码龄11年 2粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值