题意:找n个数中无修改的区间不同数个数

题解:使用主席树在线做,我们不能使用权值线段树建主席树

我们需要这么想:从左向右添加一到主席树上,添加的是该数字处在的位置

但是如果该数字前面出现过,就在此版本的主席树上的前面出现的位置减一,接着才在此位置上添一

这样查找是按照右区间版本的主席树来找(lef,rig)的数字

因为要将此区间每个不同的数都处在最后出现的位置

/*在线求区间内不同的数的个数:从头到尾添加到线段树(不是权值线段树,是存值的线段树)中
如果此数之前出现过就先减去,接着再加,最后在区间(l,r)中找到root[r]这个历史版本*/
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define dir(a,b) (a>>b)
const int Max=;
int root[Max],tot,val[Max];
struct node
{
int lef,rig,sum;
}msegtr[Max*];
map<int,int> mp;
void Init()
{
tot=;
msegtr[].lef=msegtr[].rig=msegtr[].sum=;
root[]=;
mp.clear();
return;
}
void Create(int sta,int enn,int &x,int y,int pos,int aad)
{
msegtr[++tot]=msegtr[y];
msegtr[tot].sum+=aad;
x=tot;
if(sta==enn)
return;
int mid=dir(sta+enn,);
if(mid>=pos)
Create(sta,mid,msegtr[x].lef,msegtr[y].lef,pos,aad);
else
Create(mid+,enn,msegtr[x].rig,msegtr[y].rig,pos,aad);
return;
}
int Query(int sta,int enn,int x,int y)//只有左边有界限
{
if(sta>=y)
return msegtr[x].sum;
int mid=dir(sta+enn,);
if(mid>=y)
return Query(sta,mid,msegtr[x].lef,y)+msegtr[msegtr[x].rig].sum;
else
return Query(mid+,enn,msegtr[x].rig,y);
}
int main()
{
int n,m,temp;
int lef,rig;
while(~scanf("%d",&n))
{
Init();
for(int i=;i<=n;++i)
{
scanf("%d",&val[i]);
if(!mp.count(val[i]))//直接加
{
Create(,n,root[i],root[i-],i,);//注意是在i这个位置加1,不是权值线段树的val[i]位置加1
}
else
{
Create(,n,temp,root[i-],mp[val[i]],-);//先在原位置减去1
Create(,n,root[i],temp,i,);
}
mp[val[i]]=i;
}
scanf("%d",&m);
for(int i=;i<m;++i)
{
scanf("%d %d",&lef,&rig);
printf("%d\n",Query(,n,root[rig],lef));//在rig的历史版本上找(lef,rig)的值
}
}
return ;
}

SPOJ DQUERY (主席树求区间不同数个数)的更多相关文章

  1. SPOJ - DQUERY 主席树求区间有多少个不同的数(模板)

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

  2. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...

  3. SPOJ - 3267. D-query 主席树求区间个数

    SPOJ - 3267 主席树的又一种写法. 从后端点开始添加主席树, 然后如果遇到出现过的元素先把那个点删除, 再更新树, 最后查询区间就好了. #include<bits/stdc++.h& ...

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

  5. D-query SPOJ - DQUERY 主席树查询区间内不同数出现的次数

    我们不以权值建立主席树,而是区间端点作为值建立线段树,一个个插入a[i],我们发现这个数之前是存在的,就需要在上个版本的主席树上减去原来的位置,并加上现在的位置,这样我们在i版本的主席树,维护1-r中 ...

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

    题目链接:https://vjudge.net/problem/SPOJ-DQUERY 题目大意:给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数. 解题思路:从左向右一个一 ...

  7. SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)

    DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...

  8. 主席树——求区间[l,r]不同数字个数的模板(向左密集 D-query)

    主席树的另一种用途,,(还有一种是求区间第k大,区间<=k的个数) 事实上:每个版本的主席树维护了每个值最后出现的位置 这种主席树不是以权值线段树为基础,而是以普通的线段树为下标的 /* 无修改 ...

  9. 主席树——求区间第k个不同的数字(向右密集hdu5919)

    和向左密集比起来向右密集只需要进行小小的额修改,就是更新的时候从右往左更新.. 自己写的被卡死时间.不知道怎么回事,和网上博客的没啥区别.. /* 给定一个n个数的序列a 每次询问区间[l,r],求出 ...

随机推荐

  1. npm run build打包后自定义动画没有执行

    问题描述:在vue项目中,当你自己写了一些自定义动画效果,然后你npm run build打包项目放到线上环境后,发现动画并没有效果. 解决办法:在vue项目中找到build文件夹下的vue-load ...

  2. nodeJs 对 Mysql 数据库的 curd

    var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : ' ...

  3. Python的jieba模块简介

    现如今,词云技术遍地都是,分词模块除了jieba也有很多,主要介绍一下jieba的基本使用 import jieba import jieba.posseg as psg from os import ...

  4. is和==,编码补充

    一,is和==的区别: 1, 通过一个ID()可以查看到一个变量表示的值在内存中的地址.    s = 'alex' print(id(s)) # 4326667072 s = "alex& ...

  5. linux文件IO操作篇 (一) 非缓冲文件

    文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...

  6. [BZOJ2809][Apio2012]dispatching(左偏树)

    首先对于一个节点以及它的子树,它的最优方案显然是子树下选最小的几个 用左偏树维护出每棵子树最优方案的节点,记录答案 然后它的这棵树可以向上转移给父节点,将所有子节点的左偏树合并再维护就是父节点的最优方 ...

  7. PIC24 通过USB在线升级 -- USB CDC bootloader

    了解bootloader的实现,请加QQ: 1273623966 (验证填bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek 今 ...

  8. ORB-SLAM 代码笔记(五)Frame类

    Frame类的成员变量主要包含从摄像头获取的图像的 1. 特征点信息(关键点+描述字) 2. 尺寸不变特征所用金字塔信息,这些都定义在ORBextractor对象中 3. 词袋模型参数,用于跟踪失败情 ...

  9. python3.6 新特性学习

    #支持类型提示 typing { def greeting(name: str) -> str: return 'Hello ' + name #在函数greeting中,参数名称的类型为str ...

  10. C# 删除文件错误 access denied

    使用以下代码正常删除整个文件夹内容时,报错如下: if (backupPathDir.Exists) { System.IO.DirectoryInfo di = new DirectoryInfo( ...