143 lines
1.9 KiB
Markdown
143 lines
1.9 KiB
Markdown
|
# 线段树查询
|
|||
|
|
|||
|
## 题目背景
|
|||
|
|
|||
|
对于 $n^2$ 次对于所有区间的最值查询,居然有很多同学使用了线段树成功实现 $O(n^2logn)$ 复杂度,可见大家对线段树的喜爱之情溢于言表。
|
|||
|
|
|||
|
## 题目描述
|
|||
|
|
|||
|
sophie写了一棵线段树,建树和查询部分的代码如下:
|
|||
|
```cpp
|
|||
|
int tot = 0;
|
|||
|
node* buildT(int l, int r){
|
|||
|
node *p = new node;
|
|||
|
p->l = l; p->r = r;
|
|||
|
p->t = ++tot;//dfs序
|
|||
|
if(l==r) return p;
|
|||
|
|
|||
|
int mid = (l + r)/2;
|
|||
|
p->ls = buildT(l, mid);
|
|||
|
p->rs = buildT(mid+1, r);
|
|||
|
return p;
|
|||
|
}
|
|||
|
void query(node* p, int l, int r){
|
|||
|
if(p->l==l && p->r==r){
|
|||
|
//到达终止结点
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
int mid = (p->l + p->r)/2;
|
|||
|
if(r <= mid) query(p->ls, l, r);
|
|||
|
else if(l >= mid+1) query(p->rs, l, r);
|
|||
|
else{
|
|||
|
query(p->ls, l, mid);
|
|||
|
query(p->rs, mid+1, r);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
对序列 $[1,n]$ 建完树之后,sophie在上面进行了所有 $n(n+1)/2$ 次区间查询 $[l,r]$,即 $[1,1],[1,2],...,[n,n]$(成功通过了 $n=500$ 的数据,获得12分!)
|
|||
|
|
|||
|
```cpp
|
|||
|
for(int l=1;l<=n;++l){
|
|||
|
for(int r=l;r<=n;++r){
|
|||
|
query(rt, l, r);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
现在sophie想知道,对于线段树上的一个节点,其在多少次查询中是**终止节点**。
|
|||
|
|
|||
|
## 输入格式
|
|||
|
|
|||
|
第一行1个整数 $n,q$
|
|||
|
|
|||
|
接下来 $q$ 行,每行2个整数 $t$ 代表询问线段树上dfs序为 $t$ 的节点在多少次查询中是**终止节点**
|
|||
|
|
|||
|
## 输出格式
|
|||
|
|
|||
|
输出 $q$ 行,每行1个整数代表答案
|
|||
|
|
|||
|
## 样例 #1
|
|||
|
|
|||
|
### 样例输入 #1
|
|||
|
|
|||
|
```
|
|||
|
4 7
|
|||
|
1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
```
|
|||
|
|
|||
|
### 样例输出 #1
|
|||
|
|
|||
|
```
|
|||
|
1
|
|||
|
2
|
|||
|
1
|
|||
|
3
|
|||
|
2
|
|||
|
3
|
|||
|
1
|
|||
|
```
|
|||
|
|
|||
|
## 样例 #2
|
|||
|
|
|||
|
### 样例输入 #2
|
|||
|
|
|||
|
```
|
|||
|
100 10
|
|||
|
43
|
|||
|
172
|
|||
|
169
|
|||
|
64
|
|||
|
196
|
|||
|
56
|
|||
|
63
|
|||
|
185
|
|||
|
27
|
|||
|
36
|
|||
|
```
|
|||
|
|
|||
|
### 样例输出 #2
|
|||
|
|
|||
|
```
|
|||
|
20
|
|||
|
39
|
|||
|
83
|
|||
|
30
|
|||
|
98
|
|||
|
52
|
|||
|
30
|
|||
|
92
|
|||
|
89
|
|||
|
246
|
|||
|
```
|
|||
|
|
|||
|
## 样例 #3
|
|||
|
|
|||
|
### 样例输入 #3
|
|||
|
|
|||
|
```
|
|||
|
见下发样例
|
|||
|
```
|
|||
|
|
|||
|
### 样例输出 #3
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
## 提示
|
|||
|
|
|||
|
对于所有数据,$1\le n,q \le 10^6, 1\le t\le 2n-1$
|
|||
|
|
|||
|
子任务1(20分):$n,q\le 1000$
|
|||
|
|
|||
|
子任务2(20分):$n,q\le 10000$
|
|||
|
|
|||
|
子任务3(60分):无特殊限制
|