/*
線段樹(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...