線段樹的妙用,求乙個序列中的某個數字的前面有幾個比它小,樸素演算法是o(n*n), 線段樹是o(n*logn), 然後再變形下就是答案了
下面提供線段樹和樹狀陣列的解題**:
//線段樹
#include#include#include#include#include#include#include#include#include#include#include#define n 32005
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
struct node
tree[n<<2];
int res[n];
void pushup(int o)
void build(int o,int l,int r)
void update(int o,int p,int v)
int m = (tree[o].l+tree[o].r)/2;
if(p <= m) update(2*o,p,v);
else update(2*o+1,p,v);
pushup(o);
}int query(int o,int x,int y)
int main()
for(i = 0; i < n; i++)
cout<#include#include#include#include#include#include#include#include#include#include#define n 32005
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
int c[n],res[n];
int lowbit(int x)
int sum(int x)
return ans;
}void add(int x)
}int main()
for(i = 0; i < n; i++)
printf("%d\n",res[i]);
}return 0;
}
線段樹對面積的劃分 HDU 1541
題目大意是對給定的很多矩形,求出面積和,重疊的部分只能算一次 可以對x和y座標進行離散化,然後對面積進行劃分,劃分成四部分,左上,右上,左下,右下 與之前的線段式線段樹不同的是,每次對寬和高進行等分的時侯,xmid和ymid在各部分出現的時候不用 1,因為這裡算的是面積,面積是連續的 注意浮點數的判...
HDU 1541 樹狀陣列
傳送門 hdu 1541 給定一組點,用座標表示,求各個層次的點的數量,每個點層次指的是其它點中 座標均不大於當前點 座標點的數量 注意題目給出,所有輸入對於 來說都是不降序,所以只要考慮 就可以了,y不增的時候x自增,所以後輸入的點不會影響先輸入點的層次 因為計算層次的時候要排除自身,所以要先更新...
樹狀陣列hdu1541
題意 大概就是計算每顆星星左下邊包括了多少顆星星,這個數值就是level。左下邊不包括本身,不超過本身的x,y的座標,可以等於。問每種level有多少顆星星。思路 1.每次輸入乙個座標對之後,都要計算一下這個它的level。2.此題的x座標可以為0,而樹狀陣列是從1開始的,所以處理的時候對每個x座標...