樹狀陣列 離散化 學習心得

2021-08-15 05:56:11 字數 1634 閱讀 2491

應用:用於計算各種「區間和」。

時間複雜度:n*log2n

基本概念及模板**:

求和原理:

線段樹求和是二分空間,而真正求和只需要用到其中的左側空間,因此出現樹狀陣列。

lowbit函式:

用於計算二進位制最低位1所在位置的權值:

**:

int lowbit(int x)

樹狀陣列中每個頂點覆蓋的範圍:[x-lowbit(n)+1,x];

求頂點的父節點:

(樹狀陣列)

對於已存在的陣列建立樹狀陣列模板**:

void build(int a,int node,int size)

更新節點,新增節點**模板:

void add(int pos,int val,int size,int node)

求區間和**模板:

int prefix_sum(int n,int node)

int sum_between(int l,int r,int node)

離散化應用:

由於空間問題,不可能開乙個1e9的int陣列,因此,如果將乙個可能超過1e8的數來說,樹狀陣列無法直接存放他的位置,因此就有了離散化。

離散化:假設有n個資料,根據他們的大小的相對關係由小到大,用數字1-n替換他們,並且不改變原本順序。

假設我們有一組數:

4 6 8 96 5 1 3 6

根據他們的大小順序可表示為:

3 5 7 8 4 1 2 5

這樣就將一組資料由他們本來的大小通過1-8這八個數代替了。

**:

struct node

sum[m];

bool cmp(node a,node b)

{ return a.val對於樹狀陣列而言,最主要的作用就是維護一組資料的字首和,而怎麼把想要解決的問題,轉化為字首和的問題,就是解決樹狀陣列問題的關鍵:

1,樹狀陣列+異或 nefu1471:

根據樹狀陣列的概念:將原本的區間異或變為樹狀陣列區間修改+1,並對最後結果對2取模,即得到想要得值。

2,樹狀陣列+逆序對+離散化,洛谷p1966

此題首先數學分析,對於兩盒火柴(a盒,b盒),對於每盒火柴給出乙個排列順序,求經過幾次交換後能使對應(ai-bi)平方和最小。

怎麼才能最小?(a-b)²=a²+b²-2*ab對於所有的和而言,a²+b²是不變的,當a*b最大時就是需要的結果。根據下列反證法可得出結論當對應大小位置相同時得到的a*b是最大的。

假設a>b,c>d;

如果a*c+b*d不是最大的就可得出這樣的結論,a*d+b*c>a*c+b*d。

化簡後得:a因此,找兩盒火柴達到相對大小位置相同的交換次數即可。

此時將兩組資料根據相對大小對其進行離散化,得到的值乙個作為陣列的i,乙個作為陣列的值 v,當i=v時即為所求結果。(此處相當於求陣列逆序對)。

資料視覺化學習心得

import pandas as pd pd.plotting.register matplotlib converters import matplotlib.pyplot as plt matplotlib inline import seaborn as sns print setup com...

離散化學習

有些資料本身很大,自身無法作為陣列的下標儲存對應的屬性。如果這時只是需要這堆資料的相對屬性,那麼可以對其進行離散化處理!離散化 當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。例如9 1 0 5 4 與 5 2 1 4 3 的逆序對個數相同。設有4個數 1234567 123...

學習心得 python學習心得

自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...