java 操作格子問題(線段樹)

來源:互聯網
上載者:User

標籤:return   tree   區間   輸入   algo   更新   i++   pre   std   

  很久之前做過線段樹的問題(操作格子),時間長了之後再次接觸到,發現當初理解的不是很透徹,然後代碼冗長,再遇到的時候發現自己甚至不能獨立地完成這個問題。

  所以演算法這個東西啊,
  第一,是要經常練習(我個人認為…每一個程式員都不應該不擅長演算法…從今天開始,要常寫部落格!)。

  第二,是一定要理解透徹,理解透徹並不是說到網上找到瞭解答,然後自己照著能夠運行出來,這樣是不夠的!甚至不是說你看完了一個演算法之後,完全不看他的解答,然後你自己寫出來,這樣也是不夠的!

  先貼題目:

問題描述

有n個格子,從左至右放成一排,編號為1-n。

共有m次操作,有3種操作類型:

1.修改一個格子的權值,

2.求連續一段格子權值和,

3.求連續一段格子的最大值。

對於每個2、3操作輸出你所求出的結果。

輸入格式

第一行2個整數n,m。

接下來一行n個整數表示n個格子的初始權值。

接下來m行,每行3個整數p,x,y,p表示操作類型,p=1時表示修改格子x的權值為y,p=2時表示求區間[x,y]內格子權值和,p=3時表示求區間[x,y]內格子最大的權值。

輸出格式

有若干行,行數等於p=2或3的操作總數。

每行1個整數,對應了每個p=2或3操作的結果。

範例輸入4 3
1 2 3 4
2 1 3
1 4 3
3 1 4範例輸出6
3資料規模與約定

對於20%的資料n <= 100,m <= 200。

對於50%的資料n <= 5000,m <= 5000。

對於100%的資料1 <= n <= 100000,m <= 100000,0 <= 格子權值 <= 10000。

 

  下面貼代碼:

 

 1 //操作格子 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 struct GridNode{ 6     int sum = 0; 7     int max = 0; 8 }segTree[400000]; 9 int a[100001];10 void build(int root, int start, int end){11     //葉子12     if (start == end){13         segTree[root].sum = a[start];14         segTree[root].max = a[start];15         return;16     }17     int mid = (start + end) / 2;18     build(2 * root, start, mid);19     build(2 * root + 1, mid + 1, end);20     //回溯更新結點21     segTree[root].sum = segTree[2 * root].sum + segTree[2 * root + 1].sum;22     segTree[root].max = max(segTree[2 * root].max, segTree[2 * root + 1].max);23     24 }25 void update(int pos, int root, int start, int end, int x){26     if (start == end){27         segTree[root].max = x;28         segTree[root].sum = x;29         return;30     }31     int mid = (start + end) / 2;32     if (pos <= mid){33         update(pos, 2 * root, start, mid, x);34     }35     else{36         update(pos, 2 * root + 1, mid + 1, end, x);37     }38     //回溯更新結點39     segTree[root].sum = segTree[2 * root].sum + segTree[2 * root + 1].sum;40     segTree[root].max = max(segTree[2 * root].max, segTree[2 * root + 1].max);41 }42 int querySum(int root, int nStart, int nEnd, int qStart, int qEnd){43     if (qStart <= nStart && qEnd >= nEnd){44         return segTree[root].sum;45     }46     int sum = 0;47     int mid = (nStart + nEnd) / 2;48     if (qStart <= mid)49         sum += querySum(2 * root, nStart, mid, qStart, qEnd);50     if (qEnd > mid)51         sum += querySum(2 * root + 1, mid + 1, nEnd, qStart, qEnd);52     return sum;53 }54 int queryMax(int root, int nStart, int nEnd, int qStart, int qEnd){55     if (qStart <= nStart && qEnd >= nEnd){56         return segTree[root].max;57     }58     int maxN = -1;59     int mid = (nStart + nEnd) / 2;60     if (qStart <= mid)61         maxN = max(maxN, queryMax(2 * root, nStart, mid, qStart, qEnd));62     if (qEnd > mid)63         maxN = max(maxN, queryMax(2 * root + 1, mid + 1, nEnd, qStart, qEnd));64     return maxN;65 }66 int main(){67     int n, m;68     cin >> n >> m;69     for (int i = 1; i <= n; i++){70         cin >> a[i];71     }72 73     build(1, 1, n);74     for (int i = 0; i<m; i++){75         int op, x, y;76         cin >> op >> x >> y;77         int resSum;78         int resMax;79         switch (op) {80         case 1:81             update(x, 1, 1, n, y);82             break;83         case 2:84             resSum = querySum(1, 1, n, x, y);85             cout << resSum << endl;86             break;87         case 3:88             resMax = queryMax(1, 1, n, x, y);89             cout << resMax << endl;90             break;91 92         }93     }94 }

 

java 操作格子問題(線段樹)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.