樹狀陣列入門

2021-09-12 23:07:11 字數 2697 閱讀 5790

樹狀陣列(模板)**

#include#include#includeusing namespace std;

const int maxn=1e6+10;

int c[maxn];

int lowbits(int x)

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

}int getsum(int x)

return sum;

}int main()

char s[10];int a,b;

printf("case %d:\n",k);

while(1)

else if(s[0]=='a')//注意這裡是else if,不能寫if,粗心被卡了

else

update(a,-b,n);}}

return 0;

}

題意:定義星星的等級為在它左下角(包括正左和正下)的星星的個數。給出若干個星星的座標(不超過15000個),輸出各個等級的星星分別有多少個。每個星星的座標不超過32000,輸入時按照y座標公升序輸入。

分析:

固定乙個維度,剩下的就是看剩下的那乙個維度了。

因為題目已經按照y座標公升序排列了,只需要每次讀入時用樹狀陣列統計x座標比小於等於x的星星有多少個算出其等級再統計就可以了。不過,要注意座標有可能為0,為0時會死迴圈,

所以在讀入座標時應加1

#include#include#include#include#define ll long long

using namespace std;

const int maxn=1e6+10;

int n,c[maxn],ans[maxn],level[maxn];

struct node

star[maxn];

int lowbit(int x)

int sum(int x)

void add(int x)

}int main()

int l;

for(int i=1;i<=n;i++)

for(int i=0;i

題意:有n頭牛,每頭牛對應乙個區間[si,ei],如果牛j 的區間是牛i 的區間的真子集(即si <= sj and ej <= ei and ei - si > ej - sj),那麼就說牛i 比牛j 強壯。要你依次輸出比第i頭牛強壯的牛數目。

思路:如果將所有牛的e區間按從大到小排序(如果e相同,則s小的排在前面)的話,那當前讀取到第i個牛的si和ei,那麼之前(假設任意牛的區間不會完全相同)的牛的sj(j<=i-1)<=si的這些牛就都比i號牛強壯了。可以理解為之前那道star的題,固定乙個維度,剩下的就是看剩下的那乙個維度了。

分析:

固定乙個維度,剩下的就是看剩下的那乙個維度了。

1.這裡有可能有兩個區間一模一樣的,防止重複疊加,需要特判 ,直接賦值!

2.si會有0的情況!

3.重點是排序要排對!

#include#include#include#include#define ll long long

using namespace std;

const int maxn=1e6+10;

int n,c[maxn],ans[maxn];

struct node

cow[maxn];

bool cmp(node a,node b)//通過排序來固定乙個維度,剩下的就是看剩下的那乙個維度了。

void add(int x)

}int main()

sort(cow+1,cow+n+1,cmp);//注意細節

ans[cow[1].id]=sum(cow[1].x);

add(cow[1].x);

for(int i=2;i<=n;i++)

for(int i=1;i<=n;i++)

printf("\n");

}return 0;

}

#include #include #include using namespace std;

int n;

struct node

chu[500010];//最初的輸入

int a[500010];//離散化後的陣列

int c[500010];//樹狀陣列

bool cmp(struct node a,struct node b)

return s;

}int main()

sort(chu+1,chu+1+n,cmp);//排序後,值最小的排在最前面

for(int i=1;i<=n;i++)//離散化

long long ans=0;//注意用long long

memset(c,0,sizeof(c));

for(int i=1;i<=n;i++)

printf("%lld\n",ans);

} return 0;

}

樹狀陣列1 樹狀陣列入門

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

樹狀陣列 入門

樹狀陣列,乙個用來區間求和修改都為log n 的演算法。在網上資料很多,看起來也不是很難,學習一下!基本上學習樹狀陣列都會看到下面這個圖,這也是最基本的乙個圖,看懂這個以後,對樹狀陣列也就會有 一定的了解了。令這棵樹的結點編號為c1,c2.cn。令每個結點的值為這棵子樹的值的總和,那麼容易發現 c1...

樹狀陣列入門

用office做了一張pdf 這是一維的情形,如果是二維,可以把每一行的一維樹狀陣列看成乙個節點,然後再把二維樹狀陣列看成一維樹狀陣列。好文章 兩道入門題 對於第一題hdu1556 題意 初始陣列元素值都為0,給定區間 x,y 將區間 x,y 每個元素的值 1,最後輸出整個陣列每個元素的值。更新區間...