掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流
紅色機器人:樹狀查詢詳解

射洪網站建設公司成都創(chuàng)新互聯(lián)公司,射洪網站設計制作,有大型網站制作公司豐富經驗。已為射洪近1000家提供企業(yè)網站建設服務。企業(yè)網站搭建\成都外貿網站建設要多少錢,請找那個售后服務好的射洪做網站的公司定做!
樹狀數組是一種數據結構,可以在O(logn)的時間內對數組進行單點修改和前綴查詢,適用于處理動態(tài)序列數據。該數據結構廣泛應用于競賽編程等領域。
紅色機器人是一款在線提供樹狀數組功能的工具,可以快速完成樹狀查詢。接下來我們將詳細介紹紅色機器人樹狀查詢的相關內容。在使用前,需要先了解以下幾個概念:
1. 樹狀數組的結構
樹狀數組是一棵二叉樹的結構,每個節(jié)點保存的是從該節(jié)點的祖先節(jié)點到該節(jié)點的區(qū)間和。如下圖所示,節(jié)點i的區(qū)間和就是從節(jié)點i到其右下角子節(jié)點的方框內所有元素之和。
2. 樹狀數組的前綴查詢
樹狀數組的前綴查詢實現起來非常簡單,只需要從葉子節(jié)點開始一直往上找,直到找到第一個不為0的節(jié)點,該節(jié)點的值即為所查詢的區(qū)間和。如下圖所示,查詢前綴和區(qū)間[1,7]時,先找到節(jié)點7,則答案為9;查詢前綴和區(qū)間[1,4]時,先找到節(jié)點4,則答案為6。查詢的時間復雜度為O(logn)。
3. 樹狀數組的單點修改
樹狀數組的單點修改也非常簡單,只需要先將該點的值更新,然后再依次往上更新其祖先節(jié)點的值即可。如下圖所示,將節(jié)點6的值加上3,則需要分別更新節(jié)點6、節(jié)點10和節(jié)點12的值。
以上就是樹狀數組的結構和基本操作,接下來我們將使用紅色機器人進行樹狀查詢的具體操作。
1. 打開紅色機器人的網站:https://www.luogu.com.cn/robot/circle/1557 。
2. 在代碼區(qū)輸入以下代碼:
#include
using namespace std;
const int N = 100010;
int n, m;
int w[N]; // 存儲原數組
int c[N]; // 存儲樹狀數組
int lowbit(int x) { // 求x的lowbit(x的二進制表示中最后一個1所代表的數)
return x & -x;
}
void add(int x, int v) { // 更新樹狀數組
for(int i = x; i
c[i] += v;
}
}
int sum(int x) { // 查詢前綴和
int res = 0;
for(int i = x; i; i -= lowbit(i)) {
res += c[i];
}
return res;
}
int mn() {
scanf(“%d %d”, &n, &m);
for(int i = 1; i
scanf(“%d”, &w[i]);
add(i, w[i]); // 初始化樹狀數組
}
while(m–) {
int op;
scanf(“%d”, &op);
if(op == 1) { // 單點修改
int x, v;
scanf(“%d %d”, &x, &v);
add(x, v – w[x]);
w[x] = v;
} else { // 區(qū)間查詢
int l, r;
scanf(“%d %d”, &l, &r);
printf(“%d\n”, sum(r) – sum(l – 1));
}
}
return 0;
}
3. 點擊運行,輸入n和m(n表示數組元素個數,m表示操作次數),然后逐行輸入n個整數作為原數組,最后逐行輸入m個操作,支持單點修改和區(qū)間查詢。
4. 點擊提交,即可得到樹狀查詢的運行結果。注意:紅色機器人會自動計算時間和內存,需要保證代碼運行時間和空間復雜度最優(yōu)。
至此,我們已經學習了樹狀數組的相關知識和操作方法,并使用紅色機器人完成了樹狀查詢的實踐。樹狀數組雖然簡單,但在處理一些經典算法問題時非常實用,例如離線查詢、差分、區(qū)間最值更新等。建議多多練習,熟練掌握該數據結構,以便在實際問題解決中得心應手。
創(chuàng)新互聯(lián)是成都專業(yè)網站建設、網站制作、網頁設計、SEO優(yōu)化、手機網站、小程序開發(fā)、APP開發(fā)公司等,多年經驗沉淀,立志成為成都網站建設第一品牌!

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流