補 張經理的員工 預處理 字首和

2021-10-05 17:18:09 字數 1549 閱讀 2519

張經理的員工

題意很清楚,這裡不再贅述。

這裡積累了一些經驗,以後遇到這種數級的資料和多組輸入的要求,基本就是預處理,打表,字首和一類的,不要想著套迴圈了,一般都會超時。

預處理所有小於等於i位置的員工個數cpre[i],所有小於等於i位置的員工下標之和pre[i]

預處理所有大於等於i位置的員工個數cfpre[i],所有大於等於i位置的員工下標之和fpre[i]預處理所有大於等於i位置的員工個數cfpre[i],所有大於等於i位置的員工下標之和fpre[i]

那麼a左邊的員工們需要移動的距離 = cpre[a]*a - pre[a]那麼a左邊的員工們需要移動的距離=cpre[a]∗a−pre[a]

那麼b右邊的員工們需要移動的距離 = fpre[b] - cfpre[b]*b那麼b右邊的員工們需要移動的距離=fpre[b]−cfpre[b]∗b

接下來a和b之間的員工們:[a+1,a+(b-a)/2]區間的員工都去a,[a+(b-a)/2 + 1,b-1]區間的員工都去b接下來a和b之間的員工們:[a+1,a+(b−a)/2]區間的員工都去a,[a+(b−a)/2+1,b−1]區間的員工都去b

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int maxn =

100005

;int b[maxn]

;ll pre[maxn]

, fpre[maxn]

;ll cpre[maxn]

, cfpre[maxn]

;int

main()

ll sum =

0,sumnum =0;

for(

int i =

1; i <=

100000

; i++

) pre[i]

= sum;

cpre[i]

= sumnum;

} sum =

0,sumnum =0;

for(

int i =

100000

; i >=

1; i--

) fpre[i]

= sum;

cfpre[i]

= sumnum;

}while

(q--

) ll fl = cpre[l]

* l - pre[l]

; ll fr = fpre[r]

- cfpre[r]

* r;

ll x =

0,y =0;

if(r - l >1)

ll ans = fl + fr + x + y;

cout<}return0;

}

張經理的員工 字首和

本來只是給校賽作為乙個簡單題,沒想到殺瘋了orz 通過率只有不到5 不知道為啥暴力複雜度達到了1e10還有這麼多人敢衝 用兩個陣列分別儲存員工數目的字首和以及員工座標的字首和,記為sum1和sum2。對於一套方案中的兩個工位a,b 假設a5 範圍內的員工到b點更近。對於要到a的員工,分為不在a的右側...

某不知出處的題,字首和字尾和預處理

description 給出數列a1,a2,an,並設 bi a1 a2 a3 an ai mod 109 7 現要求把所有的bi 算出來 input 輸入包含多組測試資料。對於每組資料,第1 行,1 個整數n 1 n 100,000 表示數列的長度。第2 行,n 個整數a1,a2,an 1 ai ...

張經理的員工 (西工大校賽A題)

張經理的公司的辦公室長達100000公尺,從最左端開始每間隔1公尺都有乙個工位 從第1公尺開始有工位 位於第i公尺的工位稱為i號工位,且這些工位都在一條水平線上。他有n個員工,每個員工分別位於xi號工位上 不同員工可能位於同乙個工位 現在張經理想把員工聚集在某兩個工位上,他有q套方案 每套方案包含兩...