题意:找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. jquery和vue分别对input输入框手机号码格式化(344)

    jQuery function fomatterTel(val, old) {//val: 当前input的值,old: input上次的值 var str = ""; var t ...

  2. MySQL必会

    SQL语言对大小写不敏感,但一般使用大.1.创建数据库 CREATE DATABASE test; 2.授予权限 CRANT ALL ON test.* to user(s); 3.使用指定数据库 U ...

  3. 第1章 MATLAB概述

    MATLAB系统由~开发环境.~语言.~数学函数库.~图形处理系统.~应用程序接口(API)5大部分组成. 界面 命令行中的语句格式 命令行的语句格式:>>变量=表达式(没有>> ...

  4. office 总结

    wps word中双击格式刷即可开启永久格式刷

  5. Java8新特性(三)——Optional类、接口方法与新时间日期API

    一.Optional容器类 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. 查看结构图可以看到有如下常用方法: of(T)—— ...

  6. 也谈js传值和传址

    通常的认识就是基本的数值元素是传值,对象等复杂结构传址,无需争论,一试便知. 首先是数值 var a = 1 var b = a a = 2 console.log(a) console.log(b) ...

  7. jmeter设置全局变量的方法

    需求: 同一个线程组内有两个http请求A.B,A请求的后置处理器中存储的有值,B请求中添加用户变量Va先要引用该值,然后B请求的前置处理器再引用用户变量va. 第一种方式: 1.A请求后置处理添加如 ...

  8. CSS3 : transform 与 transform-origin 属性可以使元素样式发生转变

    CSS3 : transform 用于元素样式的转变,比如使元素发生位移.角度变化.拉伸缩小.按指定角度歪斜 transform结合transition可实现各类动画效果 transform : tr ...

  9. Java IO学习--RandomAccessFile

    1.什么是 随机访问文件流 RandomAccessFile 这个类在很多资料上翻译成中文都是:随机访问文件,在中文里,随机是具有不确定的含义,指一会访问这里,一会访问那里的意思.如果以这种语义来解释 ...

  10. HDU 3269 P2P File Sharing System(模拟)(2009 Asia Ningbo Regional Contest)

    Problem Description Peer-to-peer(P2P) computing technology has been widely used on the Internet to e ...