hdu 6315 線段樹 樹狀陣列

2021-08-22 05:01:14 字數 1404 閱讀 3866

杭電多校第二場1007題

給你兩個大小為n的陣列,a,b,初始b為1到n的乙個全排列,a全為0。有q次操作。

每次操作有兩種情況:

1. 將a陣列區間[l,r]的每個數+1。 

2. 輸出σa[i]/b[i](l<=i<=r)σa[i]/b[i](l<=i<=r)。

在只有當 ai 加1的次數能夠整除 bi 時才會對區間答案有貢獻,這樣用線段樹記錄一開始每個點初始化為bi,每次訪問的區間有這個點就減1,當為0時表示可以整除bi此位置的貢獻加1,然後向下查詢初始的bi的值重新賦值,而當查詢區間的和時,加上每個點的貢獻就行了。

線段樹用來維護最小值(初始值為b,多次查詢區間最值,當區間最小值為0時更新樹狀陣列),樹狀陣列用來求ai/bi的和。

**實現時主要就是需要樹狀陣列和線段樹的模板,然後還需要自己寫乙個dfs(用來搜素當某區間為0時該區間內0的值的位置)。

#include#include#include#include#include#include#define maxn 100010

#define inf 0x3f3f3f3f

using namespace std;

int n,m;

int a[maxn];//初始陣列

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

int lowbit(int x)

void add(int pos,int x)

}int query1(int pos)

return res;

}struct nodetree[maxn<<2];

void pushup(int index)

void pushdown(int index)

}void build(int l,int r,int index)

int mid = (l+r)>>1;

build(l,mid,index<<1);

build(mid+1,r,index<<1|1);

pushup(index);

}void dfs(int i)

int ls=i*2,rs=i*2+1;

if(tree[ls].mn==0)

if(tree[rs].mn==0)

pushup(i);

}void updata(int l,int r,int index,int val)

return ;

}pushdown(index);

int mid = (tree[index].l+tree[index].r)>>1;

if(l <= mid)

if(r > mid)

pushup(index);

}int main()

else}}

return 0;

}

hdu 1166 樹狀陣列 線段樹

一道線段樹和樹狀陣列的基礎題 用樹狀陣列做 includeusing namespace std define n 50010 int size,c n int lowbit int x void modify int i,int x int sum int i return ans int mai...

hdu 1166 線段樹 樹狀陣列

剛剛做完4351的線段樹 想起當初入門的線段樹水題 於是迅速乾掉!裸裸的超標準單點更新線段樹格式 剛剛看了樹狀陣列 用來再次刷了一次這道題 下面 2012.9.24 include include include const int maxx 50000 using namespace std in...

hdu1394 線段樹 樹狀陣列

題目 就是求乙個陣列的逆序數,然後依次將陣列的第乙個數調到最後,最後求出最小的逆序數 做了兩種,線段樹和樹狀陣列 利用線段樹求逆序數 每次將數字x插到線段樹的 x 位置,然後球一下,該線段樹右邊的和,即為逆序數的個數 第一次用線段樹,做這個。include include include inclu...