張經理的員工
題意很清楚,這裡不再贅述。
這裡積累了一些經驗,以後遇到這種數級的資料和多組輸入的要求,基本就是預處理,打表,字首和一類的,不要想著套迴圈了,一般都會超時。
預處理所有小於等於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套方案 每套方案包含兩...