聚會 字首和 取模的細節

2021-08-28 16:01:21 字數 1601 閱讀 3456

【描述】    在成都的一條街道上,一共有 n 戶人家,每個家庭有 xi 個人,他們和諧的生活在 一起,作為全國和諧街道,他們經常會小範圍組織活動,每次活動會選擇一戶作為聚點, 並要求某些家庭參加,為了方便通知,村長每次邀請位置連續的家庭。因為每戶人數不 同,每個家庭之間有一定距離,村長希望你計算出每次邀請的家庭的移動代價。第 i 個家 庭移動到家庭 j的代價是:  xi*dis(i,j) dis(i,j)表示 i到 j的距離,村長一共安排了 m次聚會,每次邀請[li,ri]的家庭參加 【輸入】 第一行兩個數表示 n,m 第二行 n-1 個數,第 i個數表示第 i 個家庭與第 i+1 個家庭的距離 di

第三行 n 個數,表示每個家庭的人數 xi

之後 m行每行三個數 x l r,表示查詢要把區間 [l,r]的家庭移動到 x 點的代價和

【輸出】

對於每個詢問輸出乙個數表示答案,對 19260817取模

【輸入樣例】

5 52 3 4 5

1 2 3 4 5

1 1 5

3 1 5

2 3 3

3 3 3

1 5 5

【輸出樣例】

【子任務】

對於 30%的資料, n,m≤1000

對於另外 20%的資料,所有家庭間的距離都為 1

對於另外 20%的資料,所有家庭人數都為 1

對於 100%的資料 , n,m≤200000;xi,di <=2*10^9

(l--r)類問題

對於靜態區間 ---- 字首和  o(1)

對於動態區間 ---- 線段樹或者樹狀陣列  o(logn)

這道題顯然就是字首和啊

ll pre_d[n];//dis字首和

ll pre_m[n];//pre_d * x 字首和

ll pre_x[n];//x的字首和

分類討論一下

l,r 全在x左邊

l,r 一左一右

l,r都在右邊

**很容易寫出

#include#define n 200050

#define mod 19260817

#define ll long long

using namespace std;

ll pre_d[n];//dis字首和

ll pre_m[n];//pre_d * x 字首和

ll pre_x[n];//x的字首和

ll n,m;

ll read()

int main()

for(int i=1;i<=m;i++)

else

if(lx)

else

if(r<=x)

} return 0;

}

不知道大家有沒有注意到

我開始寫的cout<<(x1-x2)%mod

但在x1 x2都取模的情況下 x1-x2可能小於0

然後就爆0了

吃一塹長一智

老師說高手都要寫乙個

int mod(int x)

HDU 5776 sum 字首和 取模

題意 給定乙個數列,求是否存在連續子列和為m的倍數,存在輸出yes,否則輸出no。題解 預處理字首和,一旦有兩個數模m的值相同,說明中間一部分連續子列可以組成m的倍數。為什麼?假設sum 1,i m k,sum 1,j m k,則sum i 1,j m 0。由鴿巢原理,可以知道一旦n m,則必定會有...

補數的概念和取模運算

補數是一種處理有符號數的方法,用於變換數字的符號,在日常生活中,常常會遇到補數的概念,例如時鐘指示為六點,想要它指向三點,可以按順時針方向將分針轉九圈,也可以逆時針方向轉三圈,結果是一致的。由於時針轉一圈為12小時,而其中12在時鐘裡是不被顯示而自動丟失的,即15 12 3,15點和三點在時鐘表示上...

取模和求餘的區別

參考 通常情況下取模運算 mod 和求餘 rem 運算被混為一談,因為在大多數的程式語言裡,都用 符號表示取模或者求餘運算。在這裡要提醒大家要十分注意當前環境下 運算子的具體意義,因為在有負數存在的情況下,兩者的結果是不一樣的。對於整型數a,b來說,取模運算或者求餘運算的方法都是 1.求 整數商 c...