HDU 1556 資料結構-樹狀陣列-改段求點
阿新 • • 發佈:2019-01-01
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1556
解題思路:樹狀陣列,只要瞭解樹狀陣列的原理就不用死記模板了,總之樹狀陣列管理的就是字首和,高度越高的的結點管理的範圍越廣
所以要是改點求段:更改一個點就要向上傳遞
所以要是改段求點:更改一個點就要向下傳遞
程式碼:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int MAXN = 1e5 + 7View Code; 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("\n"); } return 0; }
思考:今年2019了呀!我向來都是唯果論,不問過程,只看結果。資料結構這種東西如果只掌握模板還有什麼意思,只有瞭解其中的原理才能夠更好的用模板。