hdu 4267 十顆線段樹

2021-06-09 07:30:59 字數 986 閱讀 7545

/*

線段樹(i-a)%k = 0 即i%k=a%k

節點維護乙個二維陣列add, add[a][b]=c,表示該區間下標i%a=b的加c

那麼, update(l, r, k, l%k, v)這樣就可以分到子區間了

但是, 這樣會爆記憶體,因為a%b#include#include#includeusing namespace std;

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

const int maxn=50002;

int a[maxn],col[maxn*3][55];

void updata(int rt,int l,int r,int a,int b,int k,int mod,int c)

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

if(a<=mid)

updata(lson,a,b,k,mod,c);

if(b>mid)

updata(rson,a,b,k,mod,c);

}int query(int rt,int l,int r,int idx)

if(l==r) return res;

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

if(idx<=mid)

res+=query(lson,idx);

if(idx>mid)

res+=query(rson,idx);

return res;

}int main()

scanf("%d",&q);

while(q--)

else}}

return 0;}/*

41 1 1 1

141 2 3 1 2

2 12 2

2 32 4

1 1 4 2 1

2 12 2

2 32 4

*/

HDU 4267 線段樹區間內部某個值更新

題意 輸入n 下面有n個數,q個操作,對於每次操作 有兩種情況。情況1.輸入1 a b k c,表示更新操作,將a b區間內的符合a i b and i a k 0.的數都 c。情況2 輸入2 a 表示查詢操作,輸出a 上的值。思路 對於這種不是對整個區間都進行更新的操作,似乎lazy演算法就沒什麼...

分狀態的樹狀陣列hdu 4267

我們用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,於是就完...

HDU 4267 三維樹狀陣列

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