这题跟HDU3333差不多吧。

离线的做法很简单,不再说了

以前做过。

主席树的做法就比较暴力了。。

什么是主席树呢。。

其实是某种称号。

在该题中的体现是可持久化的线段树。

对于一个数

如果以前没出现过

就插入到主席树中

否则就删除以前那个。

再插入主席树。

注意,所有的更新和删除都是建立了新的节点来保持其历史状态的。。

对于T[i]我们存的是从1到i区间的不同的数出现了多少个。

然后这棵树是根据T[i - 1]来建立的。

代码如下。。第一次写主席树。 几乎是照着爱将的代码写的。

不过他是倒着来插入的,我是正向来的。 无非是一个以左端点为根查询。一个以询问的右端点为根查询,

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#define INF 111111111
#define MAXN 33333
#define MAXM 600005
using namespace std;
int n, tot, q, a[MAXN];
int T[MAXM], lson[MAXM], rson[MAXM], val[MAXM];
int nxt[MAXN], b[MAXN];
int build(int l, int r)
{int rt = tot++;val[rt] = 0;int m = (l + r) >> 1;if(l != r){lson[rt] = build(l, m);rson[rt] = build(m + 1, r);}return rt;
}
int update(int rt, int pos, int v)
{int newrt = tot++, tmp = newrt;int l = 1, r = n;val[newrt] = val[rt] + v;while(l < r){int m = (l + r) >> 1;if(pos <= m){lson[newrt] = tot++;rson[newrt] = rson[rt];newrt = lson[newrt];rt = lson[rt];r = m;}else{rson[newrt] = tot++;lson[newrt] = lson[rt];newrt = rson[newrt];rt = rson[rt];l = m + 1;}val[newrt] = val[rt] + v;}return tmp;
}int query(int rt, int pos)
{int ret = 0;int l = 1, r = n;while(pos > l){int m = (l + r) >> 1;if(pos <= m){ret += val[rson[rt]];rt = lson[rt];r = m;}else{l = m + 1;rt = rson[rt];}}return ret + val[rt];
}
int main()
{while(scanf("%d", &n) != EOF){tot = 0;memset(nxt, -1, sizeof(nxt));for(int i = 1; i <= n; i++){scanf("%d", &a[i]);b[i - 1] = a[i];}sort(b, b + n);int cnt = unique(b, b + n) - b;T[0] = build(1, n);for(int i = 1; i <= n; i++){int id = lower_bound(b, b + cnt, a[i]) - b;if(nxt[id] == -1)T[i] = update(T[i - 1], i, 1);else{int t = update(T[i - 1], nxt[id], -1);T[i] = update(t, i, 1);}nxt[id] = i;}scanf("%d", &q);while(q--){int l, r;scanf("%d%d", &l, &r);printf("%d\n", query(T[r], l));}}return 0;
}

转载于:https://www.cnblogs.com/suncoolcat/p/3358195.html

SPOJ DQUERY 求区间内不同数的个数 主席树相关推荐

  1. hdu 3333 Turing Tree 求区间内不同数的和——线段树解法

    http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意:求区间内不同数的和 #include<bits/stdc++.h> using name ...

  2. 区间内x的出现个数(主席树)

    题目大概:求区间内x出现的次数 出题人yjy Description ZJK 给你一个长度为 n 的数列和 m 次询问,每次询问从第 l 个到第 r 个数中,数 x 出现 了多少次. Input 第一 ...

  3. ZOJ - 4117 BaoBao Loves Reading(树状数组求区间内不同数的个数+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,其意义为第 i 秒需要看第 a[ i ] 种书,书架上可以供应无限种书,但是书桌有容量,当书桌上的容量达到上限后,如果还想从书架上拿新书来看, ...

  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) (1 ...

  5. hud 3874 求区间内不同数字的和

    http://acm.hdu.edu.cn/showproblem.php?pid=3874 和求区间内不同数字的个数一样. //#include<bits/stdc++.h> //usi ...

  6. python acm 素数个数_湘潭大学OJ-1098求区间内素数个数问题

    求区间内素数个数问题 题目描述 Description 给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数.限制:Time Limit : 1 ...

  7. Olympiad(求区间内的美丽数)超详细 (C,C++)

    题目: You are one of the competitors of the Olympiad in numbers. The problem of this year relates to b ...

  8. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  9. python计算区间内偶数和_Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和...

    晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...

最新文章

  1. axure 下拉多选 元件_Axure教程:下拉多选列表集合(多选下拉列表+单选下拉列表+分级下拉列表)...
  2. GO语言教程1:Windows环境下GO语言的安装与配置
  3. vue + webpack 模拟后台数据
  4. 计算机组成与系统 报告,计算机组成与系统结构实验报告2
  5. YBTOJ:字符串题(KMP)
  6. java 文件存储_文件存储学生信息(JavaIO流)
  7. java使用ajax异步刷新_2018.6.27 Ajax实现异步刷新
  8. 使用Python实现生产者消费者问题
  9. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
  10. 人一生的8种朋友(看看身边的朋友属于哪种)
  11. 拉格朗日法建立动力学方程
  12. Excel将一个表格的格式复制到其他表格,不用格式刷
  13. 共同好友(java)
  14. mysql查分区数据_mysql之数据分区
  15. Go的Negroni库
  16. CoreData基础
  17. git pull 报错 Your local changes would be overwritten by merge. Commit, stash or revert them to procee
  18. 欧文分校计算机新sat多少分录取,加州大学欧文分校留学托福成绩要求95分 SAT1800分...
  19. [最短路-Floyd][并查集]SSL P2344 刻录光盘
  20. 机器学习讲座总结-读图时代的识图技术-车库咖啡

热门文章

  1. vue.js computedmethod
  2. 4.5 面部验证与二分类
  3. docker update
  4. Pandas Apply函数
  5. spacy 英文模型下载_spaCy2.1中文模型包
  6. python读写大文件 meoryerror_Python – 如何在没有MemoryError的情况下gzip大文本文件?...
  7. 云资源中的低成本战斗机——竞价实例,AWS、阿里云等六家云厂商完全用户使用指南
  8. Tomcat学习总结(17)—— Tomcat生产环境中域名访问和连接MySQL
  9. mysql crc16_MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated错误
  10. tm是什么域名_天猫入驻条件门槛是什么意思?企业入驻天猫详细解析