4
5
6
7
8
9
10
11
|
findKthElement
k
{
l
1
r
maxn
mid
;
while
<
r
{
mid
+
/
2
;
if
(
getsum
>=
K
)
;
else
;
}
return
l
;
如果给定一个二维整数矩阵A,求A[1][1]~A[x][y] 这个子矩阵中所有元素之和,以及给单点A[x][y] 加上整数v:
只需把getsum和update函数中的for循环改为两重
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
;
y
{
{
j
j
{
;
}
}
}
{
;
{
)
;
}
;
区间更新,单点查询
- 将getsum改为沿着i增大lowbit(i)的方向
- 将update改为沿着i减小的lowbit(i)的方向
- c[i]不再表示这段区间的元素之和,而是表示这段区间每个数被加了多少
- int getsum(int x)返回第x个整数的值(就是从小块到大块累加一共被增加了多少)
6
|
{
sum
0
;
)
]
;
sum
;
- void update(int x,int v)是将前x个整数都加上v
|
{
)
;
- 所以,~~i从x往后是从小块更新到大块c[i],i从x往前是累加前面的覆盖块的值~
1057. Stack (30)-PAT甲级真题(树状数组)
- 求栈内所有元素的中位数:用排序查询的方法会超时~~~用树状数组,即求第k = (s.size() + 1) / 2大的数。查询小于等于x的数的个数是否等于k的时候用二分法更快~
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#include <cstdio>
#include <stack>
#define lowbit(i) ((i) & (-i))
const
maxn
100010
;
using
namespace
std
;
;
stack
<
int
>
s
;
{
)
;
}
{
;
-=
)
;
;
}
PeekMedian
(
{
left
right
k
.
size
;
right
{
;
)
;
else
;
}
printf
(
"%dn"
left
;
}
main
{
temp
;
scanf
"%d"
&
;
char
str
[
15
;
i
++
{
"%s"
;
==
'u'
{
;
push
;
;
}
else
'o'
{
(
!
empty
{
top
-
;
;
pop
;
{
"Invalidn"
;
}
{
)
;
else
;
}
}
;
}
|
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|