题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
解题思路:树状数组,只要了解树状数组的原理就不用死记模板了,总之树状数组管理的就是前缀和,高度越高的的结点管理的范围越广
所以要是改点求段:更改一个点就要向上传递
所以要是改段求点:更改一个点就要向下传递
代码:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int MAXN = 1e5 + 7; int a[MAXN]; int t; int low_bit(int k) { return k & -k; } void update(int i, int val) { while(i > 0) { a[i] += val; i -= low_bit(i); } } int sum(int k) { int ret = 0; while(k <= t) { ret += a[k]; k += low_bit(k); } return ret; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d", &t) && t) { memset(a, 0, sizeof(a)); int b, c; int temp = t; while(temp--) { scanf("%d%d", &b, &c); // cout << "b: " << b << " c: " << c << endl; update(c, 1); if(b > 1) update(b-1, -1); } printf("%d", sum(1)); for(int i = 2; i <= t; i++) { printf(" %d", sum(i)); } printf(" "); } return 0; }
思考:今年2019了呀!我向来都是唯果论,不问过程,只看结果。数据结构这种东西如果只掌握模板还有什么意思,只有了解其中的原理才能够更好的用模板。