分狀態的樹狀陣列hdu 4267

2021-06-09 06:59:58 字數 644 閱讀 9304

我們用tree[v][k][mod]來表示樹狀陣列的狀態。

假如a、b、c、k,那麼用樹狀陣列,區間更新,update(b,a%k,k,c),update(a-1,a%k,k,-c) ,就可以了~~~

也就是說,區間[1,b]內每個ui % k == mod ,那麼ui 的值就加c ,然後[1,a-1]區間內每乙個ui-c,於是就完成了[a,b]這個區間內的更新了~~

查詢q的時候也容易,列舉k的每一種狀態i(1~10),然後得到 mod = q%i 時的情況~~~ 單個查詢的時間複雜度o(10logn) ...

#includeint n,s[50010];

int tree[50010][11][10];

int lowbit(int v)

void init()

void update(int mod,int k,int v,int add)

}int query(int a,int v)

v+=lowbit(v);

} return sum;

}int main()

scanf("%d\n",&q);

while(q--)

else

} }return 0;

}

HDU 4267 三維樹狀陣列

1.題目鏈結。題目的操作其實很像去區間修改,區間查詢的操作了,但是這個操作的區間不再是連續的了,而是離散的。但是這裡還是可以用樹狀陣列維護的,因為k很小,所以k和i k其實只有c 10,2 種情況,我們對每一種情況建一顆樹狀陣列,然後查詢的時候查對應的樹狀陣列即可。includeusing name...

hdu4267(樹狀陣列,有規則區間修改)

hdu4267 題目大意 一段序列,修改某個區間 下標號成等差序列 的元素的值,查詢某個點的值 對每個公差 以及 某段開始下標對每個公差的取餘 確定某個點被修改的方式,或者這個修改的起始位置?建立k k個樹狀陣列 include include include include include inc...

HDU 5324(分治 樹狀陣列)

本題目的原來意思是,給定兩個長度為n的陣列,l,r,要求乙個子串行 可以不連續 使的l遞減,r遞增。分析 加上下標遞增,兩個維度增,乙個減,那麼考慮 d i 代表以i為起點的串往後找能得到的最大長度,用分治方法更新最有值。那麼下面說一下,怎麼分治維護最優。首先,陣列原順序保持不變,就是下標遞增,對於...