poj3468 樹狀陣列的區間快速更新和查詢

2021-07-11 10:43:55 字數 839 閱讀 1851

直接用樹狀陣列會超時;所以必須快速更新。

/*分析:由於本題更新的時候是區間更新

所以不能直接去乙個個更新區間內的點,肯定會超時

對於每次更新c(a,b,d)表示區間[a,b]內的值增加d

用ans[a]表示a~n區間元素增加的值,所以對於c(a,b,d)有:ans[a]+=d,ans[b+1]-=d;

則每次詢問的時候q(a,b),求a~b的和sum=sum(a,b)+ans[a]*(b-a+1)+ans[a+1]*(b-a)...+ans[b]//sum(a,b)表示a,b的和 

sum=sum(a,b)+sum(ans[a+t]*(b-a-t+1))=sum(a,b)+sum(ans[i]*(b-i+1));a<=i<=b;

sum=sum(a,b)+(b+1)*sum(ans[i])-sum(ans[i]*i);//1~b所以(b+1)*sum(ans[i]),1~a-1則a*sum(ans[i]) 

所以可以用兩個樹狀陣列分別表示ans[i]的字首和 和 ans[i]*i的字首和

#include #include typedef long long ll;

const int max=100000+10;

ll n,q;

ll sum[max],c1[max],c2[max];

ll lowbit(ll x)

void update(ll x,ll d,ll *c)

}ll query(ll x,ll *c)

return sum;

}int main()

for(int i=0;ielse}}

return 0;

}

poj 3468 樹狀陣列 區間修改 區間求和

這是利用樹狀陣列進行 區間求和區間修改,寫起來比線段樹輕鬆許多,具體的原理參考大佬部落格 如下 1 2 poj 3468 樹狀陣列 區間修改 和 區間查詢 3原理 4c1 和 c2 是兩個差分陣列,所以輸入資料時 c1 i a i a i 1 56 7 include 8 include 9 inc...

POJ 3468(樹狀陣列的威力)

之前說過這是線段樹的裸題,但是當看了 這篇題解後我簡直震驚了,竟然能如此巧妙地轉化為用樹狀陣列來處理,附上部分截圖 最好還是進入原 細細品味 依照他的思路附上我的 1 include2 include3 define lowbit x x x 4 typedef long long ll 5 con...

poj3468 樹狀陣列 一維 區間更新 區間查詢

其實這題應該是線段樹區間更新的模板題,我現在用樹狀陣列的方法做 理解樹狀陣列一維的區間更新和區間查詢需要一些基礎 知道的直接繼續往下看 樹狀陣列 一維 單點更新 區間查詢 最基礎 樹狀陣列 一維 區間更新 單點查詢 其實樹狀陣列本質就是單點更新 區間查詢,其它用法都是通過轉化成本質用法實現 一維的區...