數狀陣列(入門)

2021-09-28 20:35:11 字數 1625 閱讀 1710

學習陣列陣列的好處:

樹狀陣列相對於線段樹的編碼來講,樹狀陣列的編碼並不複雜,反而很簡單,對於一些區間求和,區間求最大值,維護區間的問題,反而能更簡單的解決

樹狀陣列核心**:

int lowbit(int i)//lowbit()可以尋找樹狀陣列中的前向位置和後向位置

例如要更改乙個區間當中的和

void update(int i,int k)//i代表位置,k代表更改量

}

假如要求一段區間的和我

int getsum(int i)//這裡先求1---i的和

}

完整求和**:

#includeusing namespace std;

#define maxn 1005

int a[maxn],c[maxn];

int n;//n個節點

int lowbit(int x)

void update(int i,int k)//每次在i位置上+k,故i上的所有和更新

}int getsum(int i)//求1--i的和

return res;

}int main()

int m;

scanf("%d",&m);

while(m--)

}}

如果我們要修改[l,r]區間的值,我們只需要update(l,k),修改l的父輩,然後在update(r+1,-k)把之前的父輩的值修改回來,區間修改就已經完成了

void update(int i,int k)//在i位置,新增k

}update(l,k);

update(r+1,-k);

注意:

在否迴圈裡輸入每個節點的值,經過update(),每個點的值就會改為我們操作想要的值

int getpoint(int i)//單點查詢

return res;

}//該操作即可完成單點查詢,單點查詢的查詢的值主要update()

的操作

#include #include #include #include #includeusing namespace std;

typedef long long ll;

const int maxn = 2e5+10;

int a[maxn], h[maxn], n; // a 數列的值,h 區間最大值

void add (int x, int val)

}int query (int l, int r)

else

}return ret;

}int main (void)

char op[2], b[10];

int x, y;

while (m--)

else}}

return 0;

}

Turing Tree(數狀陣列)

sample output 156 36 statistic submit back 題意 求乙個區間內不重複數字的和,例如1 1 1 3,區間 1,4 的和為4。題解 先把要求的區間按右區間公升序排序,再把原來的陣列按順序依次插入樹狀陣列,假設當前插入a i 先判斷a i 在之前有沒有出現過,沒有...

模板數狀陣列

如題,已知乙個數列,你需要進行下面兩種操作 第一行包含兩個正整數 n,m,分別表示該數列數字的個數和操作的總個數。第二行包含 n個用空格分隔的整數,其中第 i個數字表示數列第 i項的初始值。接下來 m行每行包含 3個整數,表示乙個操作,具體如下 輸出包含若干行整數,即為所有操作 222 的結果。in...

poj 3298 數狀陣列

題目大意是一條大街上住著n個桌球愛好者,他們的水平高低用乙個數值表示,他們經常舉辦比賽,比賽要三個人,一人當裁判。對裁判是有一定要求的,裁判的水平必須介於兩選手之間且必須住他們中間,計算可以舉辦多少場比賽 include include define maxn 100005 int c 20050 ...