差分法 字首和 蒜頭君的數字

2021-08-17 21:54:17 字數 1158 閱讀 8276

大致思路:

很明顯,很大的數字,暴力是會超時的。所以比較好的方法是差分法+字首和

第一次接觸,就題說一說自己的理解。

可以想象所有的數平鋪在地上,如果要把乙個區間上的數都同時加d,那麼很直觀地,就是一座一座山堆在上面。(請發揮想象力!)那麼,我只需要把區間的首的sum值+d,尾+1處的sum值-d(同時注意取模,特別是:如果要減去乙個數,為了防止其變成負數,必須要先加再模!)。然後再把每個數的sum值都加上 上乙個數的sum值,這樣就能先把堆上去的都計算好。最後呢,就把每乙個數它本身的值,加上你堆好的數,就成了最終的數。當然,這裡大大節省時間複雜度的地方還在於「字首和」,也就是你在最後的時候每個數表示的是 此數及之前所有的數之和。這樣最後只需要a[r]-a[l-1]就可以得到這個區間的數之和了。(當然,又相減了,注意加了再模)。

我的ac**:

#include#includeusing namespace std;

long long sum[200005];

long long a[200005];

const int mod=1e9+7;

int main()

while(m--)

for(int i=1;i>l>>r;

l++; r++;

cout<

後來想了想覺得有點打腦殼,覺得還是應該樹立乙個小想法:對於取模,不用太苛求於去了解這個數字的乙個具體大小,就很直接地認為沒有取模,或者說它就是被減成了乙個負數(加又模其實會讓它成正數),就理解成乙個負數。然後再來聯絡演算法過程,就會少很多冗餘想法限制。只不過你在寫**的時候時刻注意加減都要取模,且減之後要先加再模。

還有個地方要注意!!!尤其對於這種輸入或者輸出的數特別多的!!用scanf和printf來輸入輸出,用cin和cout輸入輸出會超時的!記住scanf裡的long long的輸入型別:%lld

字首和 蒜頭君班級排隊打水

題目是這樣的 這道題如果不考慮時間的話很容易解,但最後會超時。所以這道題的關鍵就在於如何用一層迴圈解決。解決思路如下 首先這道題在草稿紙上演算,拿輸入樣例來說,如果要知道某個區間打水的人花費的時間總和,可以先不看特定區間,先算出每個人打水需要的時間,我們把每個人打水需要的時間存到乙個新的陣列裡,命名...

最高的牛 (差分 字首和)

有 n 頭牛站成一行,被編隊為1 2 3 n,每頭牛的身高都為整數。當且僅當兩頭牛中間的牛身高都比它們矮時,兩頭牛方可看到對方。現在,我們只知道其中最高的牛是第 p 頭,它的身高是 h 剩餘牛的身高未知。但是,我們還知道這群牛之中存在著 m 對關係,每對關係都指明了某兩頭牛 a 和 b 可以相互看見...

前字首和 新穎的差分

問題 給出乙個序列 a i 字首和 s sum limits a i 前字首和 ss sum limits s i 現在給出 n 個操作。一些是修改某個 a i 一些事查詢某個 ss i s i a 1 a 2 a i ss i s 1 s 2 s i 當修改某個 a i 為 x 時,對於 s 相當...