樹狀陣列(模板)**:
#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,最後輸出整個陣列每個元素的值。更新區間...