1. 程式人生 > >HDU 1556 資料結構-樹狀陣列-改段求點

HDU 1556 資料結構-樹狀陣列-改段求點

題目連結: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("\n"); } return 0; }
View Code

思考:今年2019了呀!我向來都是唯果論,不問過程,只看結果。資料結構這種東西如果只掌握模板還有什麼意思,只有瞭解其中的原理才能夠更好的用模板。