spoj 3267 D-query
题目链接:http://vjudge.net/problem/SPOJ-DQUERY
------------------------------------------------------------------------------
主席树模板题之一 求不带修改的区间不同数个数
最近学习了下发现主席树就是可持久化线段树 由于每次单点修改只会改变一条链上的信息
所以我们可以把其余部分的信息重复利用 然后再新建一条链作为这次修改后的这条链的新状态
所以每次单点修改的时间复杂度和空间复杂度都是$O(logN)$
懂了原理后就像普通线段树一样按照自己的习惯来写就好 不需要准备什么模板
而对于这种求区间不同的数的个数的问题 我们只需维护对于每种前缀区间 每个数最后一次出现位置
然后所有最后一次出现位置对整个区间有$1$的贡献
这样就可以根据询问的区间右端点对应的版本 用区间减法来求区间不同数的个数
#include <bits/stdc++.h>
using namespace std;
const int N = 3e4 + , T = N * , L = 1e6 + ;
int sum[T], ch[T][], root[N << ], ma[N], last[L];
int croot, cnt, n, q;
void build(int x, int L, int R)
{
if(L == R)
{
sum[x] = ;
return;
}
int mid = (L + R) >> ;
ch[x][] = ++cnt;
build(cnt, L, mid);
ch[x][] = ++cnt;
build(cnt, mid + , R);
sum[x] = sum[ch[x][]] + sum[ch[x][]];
}
void update(int x, int L, int R, int y, int delta, int pre)
{
if(L == R)
{
sum[x] = sum[pre] + delta;
return;
}
int mid = (L + R) >> ;
if(y <= mid)
{
ch[x][] = ++cnt;
update(cnt, L, mid, y, delta, ch[pre][]);
ch[x][] = ch[pre][];
}
else
{
ch[x][] = ch[pre][];
ch[x][] = ++cnt;
update(cnt, mid + , R, y, delta, ch[pre][]);
}
sum[x] = sum[ch[x][]] + sum[ch[x][]];
}
int query(int x, int L, int R, int r)
{
if(R <= r)
return sum[x];
int mid = (L + R) >> ;
if(r <= mid)
return query(ch[x][], L, mid, r);
return
sum[ch[x][]] + query(ch[x][], mid + , R, r);
}
int main()
{
scanf("%d", &n);
root[++croot] = ++cnt;
ma[] = ;
build(cnt, , n);
int x, y;
for(int i = ; i <= n; ++i)
{
scanf("%d", &x);
root[++croot] = ++cnt;
update(cnt, , n, i, , root[croot - ]);
if(last[x])
{
root[++croot] = ++cnt;
update(cnt, , n, last[x], -, root[croot - ]);
}
last[x] = i;
ma[i] = root[croot];
}
scanf("%d", &q);
while(q--)
{
scanf("%d%d", &x, &y);
if(x > )
printf("%d\n", sum[ma[y]] - query(ma[y], , n, x - ));
else
printf("%d\n", sum[ma[y]]);
}
return ;
}
spoj 3267 D-query的更多相关文章
- SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)
DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...
- SPOJ 3267 D-query(离散化+在线主席树 | 离线树状数组)
DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...
- SPOJ - 3267. D-query 主席树求区间个数
SPOJ - 3267 主席树的又一种写法. 从后端点开始添加主席树, 然后如果遇到出现过的元素先把那个点删除, 再更新树, 最后查询区间就好了. #include<bits/stdc++.h& ...
- 【SPOJ】375. Query on a tree(树链剖分)
http://www.spoj.com/problems/QTREE/ 这是按边分类的. 调试调到吐,对拍都查不出来,后来改了下造数据的,拍出来了.囧啊啊啊啊啊啊 时间都花在调试上了,打hld只用了半 ...
- SPOJ 3267. D-query (主席树,查询区间有多少个不相同的数)
3267. D-query Problem code: DQUERY English Vietnamese Given a sequence of n numbers a1, a2, ..., an ...
- SPOJ 3267 求区间不同数的个数
题意:给定一个数列,每次查询一个区间不同数的个数. 做法:离线+BIT维护.将查询按右端点排序.从左到右扫,如果该数之前出现过,则将之前出现过的位置相应删除:当前位置则添加1.这样做就保证每次扫描到的 ...
- spoj 375 QTREE - Query on a tree 树链剖分
题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...
- SPOJ 375 QTREE - Query on a tree
思路 注意本题只能用C,不能用C++ 其他的都和上一题一样 代码 #include <stdio.h> #include <string.h> #define MAXN 100 ...
- SPOJ 3978 Distance Query(tarjan求LCA)
The traffic network in a country consists of N cities (labeled with integers from 1 to N) and N-1 ro ...
- SPOJ 3267 DQUERY - D-query (主席树)(区间数的种数)
DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...
随机推荐
- CDQ分治总结
\(CDQ\)分治小结 标签:知识点总结 阅读体验:https://zybuluo.com/Junlier/note/1326395 身为一个资深菜鸡 \(CDQ\)分治一开始学了一晚上,后来某一天又 ...
- kotlin学习(7)高阶函数
高阶函数 以另一个函数作为参数或者返回值的函数被称为高阶函数. 函数类型 //隐式声明(省略了变量类型) val sum = (x:Int, y:Int -> x+y) val action = ...
- Python数据结构与算法?
数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是 ...
- hdu1263 简单模拟
题意:依据水果销量表.依照特定格式输出 格式:首先按产地排序,然后同一产地按水果名排序 注意:第一,设计多级排序 第二.同一产地同一水果可能多次出现,所以须要在前面已经输入的水果里 ...
- 在django中使用循环与条件语言
{% if not Article_type_id %} <li class="active"><a href="/">全部</a ...
- kNN分类算法实现
kNN算法就是计算每个点到其他所有点的距离,选出距离最小的k个点.在这k个点里,哪个类别的最多,就把待分类的点归到哪类. kNN.py: from numpy import * import oper ...
- IDEA创建maven的web项目时,main文件夹下没有java,resources目录等源文件夹
https://blog.csdn.net/qq_34377273/article/details/83183307
- WPS专业版及序列号
目录 1. 软件下载 2. 序列号(永久) 1. 软件下载 城通网盘:https://sn9.us/dir/13403389-35833830-3fc98f (仅Android版) 官网: https ...
- STM32 GPIO相关
1. STM32 的 IO 作为输入的时候,可以程序设置上下拉电阻(可以不用外接上下拉电阻). 2.GPIO有四种输入模式:浮空输入.上拉输入.下拉输入.模拟输入: 3.GPIO有四种输出模式:开漏输 ...
- VB.NET Event RaiseEvent用处
一.代码 Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventA ...