樹狀陣列專項

2021-06-20 21:46:18 字數 2205 閱讀 9916

poj 2352

此題一開始理解錯了乙個地方,而且一開始也沒很好的理解樹狀陣列,做了很長時間。

其實此題的輸入是有規律的,即一直按照x,y遞增的規律。所以,判斷第i個輸入,只需要判斷

前i-1個元素中x的值,而不用考慮y,因為y一直是遞增輸入的。所以用乙個樹狀陣列來處理x即可。

#include #include #include int level[15010];

int xx[32010]; //儲存x的值

int lowbit( int x )

void update( int x )

}int getsum( int pos )

return sum;

}int main()

for( i = 0; i < n; i++ )

printf("%d\n", level[i]);

}return 0;

}

poj 3067

ps:輸入無規律,所以先進行排序處理,然後用樹狀陣列。。。。這題被坑了很久,因為結果要用long long。。。

#include #include #include typedef struct node

node;

node arr[1010000];

int xx[1010];

int lowbit(int x)

void update( int x )

}int getsum( int pos )

return sum;

}int cmp( const void *a, const void *b )

int main()

printf("test case %d: %i64d\n", ncas++, sum);

}return 0;

}

poj 2155

此題為二維樹狀陣列。用樹狀陣列儲存某位置的變換次數。然後該處的值為 次數%2

#include #include #include int trie[1010][1010];

int x, n, t;

int lowbit( int x )

void update( int x, int y, int val )

long long int getsum( int x, int y )

int main()

else

getchar();

}puts("");

}return 0;

}

poj 3321

題意:一顆有n個分支的蘋果樹,根為1,每個分支只有乙個蘋果,給出n-1個分支的關係和給出m個操作,q x表示詢問x的子樹(包括x)蘋果的數量,c x表示若分支x上有蘋果,則摘下來,若沒有則會生出乙個,輸出每個詢問的值。

分析:每個分支其實就是乙個節點,先dfs整個樹,求出每個節點的時間戳,即每個節點第一次訪問的時間和最後一次訪問的時間,分別用begin和end記錄,以時間戳為編號,則在begin[x]和end[x]之間的編號的節點就是x的子樹,以時間戳為樹狀陣列的下標,查詢時,只要求第一次訪問的編號到最後一次訪問的編號之間的和就行了,即sum(end[x])-sum(begin[x]-1);修改時,只要修改第一次訪問的編號即可,即update(begin[x])。但是修改前要判斷該位置是0或1,0則加1,1則減1。

還有別忘了初始化。

//ps:沒明白尤拉路徑,再看一下。

#include#include#define n 100010

struct edgeedge[n];

int c[n],first[n],begin[n],end[n];

int n,g,count;

void addedge(int u,int v)

int lowbit(int x)

void update(int x,int num)

}int sum(int x)

return s;

}void dfs(int u)

int main()

{ int u,v,m,ans,i;

char s[10];

scanf("%d",&n);

g=0;

memset(first,-1,sizeof(first));

for(i=0;i

陣列專項總結

陣列學習的感想與心得 學了陣列這一章,我有一種頭大的感覺,我還發現竟然可以跟方陣有一些關聯,難怪計算機和數學密不可分,但是問題在於,方陣也很難。很多難點,有時難以抓住其中的邏輯關係,有時抓住了邏輯關係,寫出了 發現有超時了,像數字拐彎問題更是難上加難,很多時候敲 時我都感到了欲哭無淚,已經到了寫出乙...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...