D-query SPOJ - DQUERY 主席树查询区间内不同数出现的次数
我们不以权值建立主席树,而是区间端点作为值建立线段树,一个个插入a[i],我们发现这个数之前是存在的,就需要在上个版本的主席树上减去原来的位置,并加上现在的位置,这样我们在i版本的主席树,维护1-r中,所有数最后一次出现的位置,然后实现区间查询,即可。
/**
按照数字所在的下标建立权值线段树
**/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxx = ;
const int maxn = 1e6+;
struct node{
int l,r;
int cnt;
}tree[maxx*];
int cnt;
int a[maxx];
int pos[maxn];
int root[maxx];
void inserts(int l,int r,int pre,int &now,int pos,int w){
tree[++cnt]=tree[pre];
now=cnt;
tree[now].cnt+=w;
if (l==r){
return ;
}
int mid=(l+r)>>;
if (pos<=mid){
inserts(l,mid,tree[pre].l,tree[now].l,pos,w);
}else{
inserts(mid+,r,tree[pre].r,tree[now].r,pos,w);
}
}
int query(int rt,int l,int r,int ql,int qr){
if(ql<=l && r<=qr){
return tree[rt].cnt;
}
int mid=(l+r)>>;
if (qr<=mid){
return query(tree[rt].l,l,mid,ql,qr);
}else if (ql>mid){
return query(tree[rt].r,mid+,r,ql,qr);
}else{
return query(tree[rt].l,l,mid,ql,qr)+query(tree[rt].r,mid+,r,ql,qr);
}
}
int main(){
int n;
while(~scanf("%d",&n)){
cnt=;
memset(root,,sizeof(root));
memset(pos,,sizeof(pos));
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
if (!pos[a[i]]){
inserts(,n,root[i-],root[i],i,);
pos[a[i]]=i;
}
else {
inserts(,n,root[i-],root[i],pos[a[i]],-);
inserts(,n,root[i],root[i],i,);
pos[a[i]]=i;
}
}
int q;
int l,r;
scanf("%d",&q);
while(q--){
scanf("%d%d",&l,&r);
printf("%d\n",query(root[r],,n,l,r));
}
}
return ;
}
D-query SPOJ - DQUERY 主席树查询区间内不同数出现的次数的更多相关文章
- SPOJ - DQUERY  主席树求区间有多少个不同的数(模板)
		D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ... 
- SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)
		DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ... 
- A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)
		题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ... 
- SPOJ - 3267. D-query 主席树求区间个数
		SPOJ - 3267 主席树的又一种写法. 从后端点开始添加主席树, 然后如果遇到出现过的元素先把那个点删除, 再更新树, 最后查询区间就好了. #include<bits/stdc++.h& ... 
- SPOJ - DQUERY 主席树
		题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32356 Given a sequence of n numbers ... 
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
		Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ... 
- HDU 4417  Super Mario 主席树查询区间小于某个值的个数
		#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> ... 
- HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)
		HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ... 
- B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)
		题目链接:https://cn.vjudge.net/contest/284294#problem/B 题目大意:查询区间内有多少个不相同的数. 具体思路:主席树的做法,主席树的基础做法是查询区间第k ... 
随机推荐
- linux基础指令参数
			eth0,eth1,eth2--代表网卡一,网卡二,网卡三-- lo代表127.0.0.1,即localhost 参考: Linux命令:ifconfig 功能说明:显示或设置网络设备 语 法:ifc ... 
- 2019-7-3-WPF-使用-Composition-API-做高性能渲染
			title author date CreateTime categories WPF 使用 Composition API 做高性能渲染 lindexi 2019-07-03 10:30:57 +0 ... 
- 【洛谷P2907】 【USACO08OPEN】农场周围的道路  水模拟分治
			P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm 题目描述 Farmer John's cows have taken an interest in ex ... 
- 模拟3题解 T3建造游乐园
			T3建造游乐园 这题的关键是推式子 i个点中,有g[i]个方案是度为偶数但不一定连通那么就要减去不合法的设已有j个合法,其个数为f[j],剩下i-j个的方案数是g[i-j]选出来一个固定的点在合法的j ... 
- 导入pymysql模块出错:No module named 'pymysql'
			前提: 使用的版本为:Python 3.6.4 pymysql已经被成功安装了,并通过命令行的方式验证已成功安装. 但在pycharm中运行工程时候时候报错:No module named 'pymy ... 
- 公司mysql问题三
			数据库连接不上,解决方案: # 加在绿框?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 
- MySQL数据库操作语句(补充1)(cmd环境运行)
			一.字符串类型 enum枚举类型 /* 也叫做枚举类型,类似于单选! 如果某个字段的值只能从某几个确定的值中进行选择,一般就使用enum类型, 在定义的时候需要将该字段所有可能的选项都罗列出来: */ ... 
- JS中获取URL的参数的方法
			这里,我学习的是使用正则的方法来获得URL的参数 函数的方法如下: <a href="www.baidu.com">百度</a> <script sr ... 
- C语言获当地时间
			代码如下: #include <stdio.h> #include <time.h> #define DEBUGE 1 int main(void) { time_t rawt ... 
- IO-02. 整数四则运算
			本题要求编写程序,计算2个正整数的和.差.积.商并输出.题目保证输入和输出全部在整型范围内. 输入格式: 输入在一行中给出2个正整数A和B. 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺 ... 
