题意
这是一道模板题。
给定Q个操作:
1 i x
:给定 $i,x$,将 $a[i]$ 加上 $x$;2 l r
:给定 $l,r$,求 $\sum_{i=l}^ra[i]$ 的值(换言之,求 $a[l]+a[l+1]+\dots+a[r]$ 的值)。
思路
模板题呀。
1 | #include<bits/stdc++.h> |
这是一道模板题。
给定Q个操作:
1 i x
:给定 $i,x$,将 $a[i]$ 加上 $x$;2 l r
:给定 $l,r$,求 $\sum_{i=l}^ra[i]$ 的值(换言之,求 $a[l]+a[l+1]+\dots+a[r]$ 的值)。模板题呀。
1 | #include<bits/stdc++.h> |
给定 $n$ 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。
这不就是裸的树状数组吗?
题目都按顺序(y的增序)。。。
1 | #include<bits/stdc++.h> |
有一个 $n$ 个元素的数组,每个元素初始均为 $0$。有 $m$ 条指令,要么让其中一段连续序列数字反转——$0$ 变 $1$,$1$ 变 $0$(操作 $1$),要么询问某个元素的值(操作 $2$)。
当然是树状数组啦。。。
这里介绍C++的一大利器——位运算。
&
在C++里叫做与运算。应该差不多吧。。大概就是这样的:(按一个个位运算)
1 | 1&1=1 |
|
在C++里叫或运算
1 | 0|1=1 |
^
在C++里叫异或(xor)
1 | 0^0=0 |
~
在C++里叫取反
顾名思义。。。
1 | ~1=0 |
然后你就会发现这道题可以用C++的异或+树状数组解决。
利用树状数组,做一个异或前缀和。然后在输出时异或一遍就好了。
(这道题的1操作就相当于异或1)
(然而我们知道x xor 1 xor 1还是等于x)
(所以对于每个1操作只需要先把l之前的xor 1,然后r+1之前的xor 1)
(对于每个2操作只需要把前面统统xor一遍)
你就完美的解决了这道题
1 | #include<bits/stdc++.h> |
这是一道模板题。
给出一个 $n\times m$ 的零矩阵 $A$,你需要完成如下操作:
1 x y k
:表示元素 $A_{x,y}$ 自增 $k$;2 a b c d
:表示询问左上角为 $(a,b)$,右下角为 $(c,d)$ 的子矩阵内所有数的和。当然是树状数组啦。。。
模板题。不介绍。
1 | #include<bits/stdc++.h> |
当然是树状数组啦。。。
食用二维树状数组。
假想括号。。。统计一下就好啦。
1 | #include<bits/stdc++.h> |
A
,接下来是一个数 $m$,表示年级主任现在在第 $m$ 节车厢;B
,接下来是两个数 $m,p$,表示在第 $m$ 节车厢有 $p$ 名学生上车;C
,接下来是两个数 $m,p$,表示在第 $m$ 节车厢有 $p$ 名学生下车。当然是树状数组啦。。。
如果字母为 A
,那么$getsum(m)$
如果字母为 B
,那么$add(m,p)$
如果字母为 C
,那么$add(m,-p)$
好了呀。。。
1 | #include<algorithm> |
Update your browser to view this website correctly. Update my browser now