張經理的員工 字首和

2022-05-23 09:27:17 字數 1087 閱讀 7587

本來只是給校賽作為乙個簡單題,沒想到殺瘋了orz(通過率只有不到5%

不知道為啥暴力複雜度達到了1e10還有這麼多人敢衝

用兩個陣列分別儲存員工數目的字首和以及員工座標的字首和,記為sum1和sum2。

對於一套方案中的兩個工位a,b(假設a5]範圍內的員工到b點更近。

對於要到a的員工,分為不在a的右側和在a的右側兩類。

拿前往a的點舉例:

比如說有k個點在a的左側,記他們的座標為x1,x2...xk,他們對答案的貢獻就是(a-x1)+(a-x2)+...(a-xk),這個式子可以轉化成k*a-(x1+x2+...xk)。

如果說x1,x2...xk在a的右側(但在mid左側),他們對答案的貢獻就是(x1-a)+(x2-a)+...(xk-a),這個式子就可以轉化成(x1+x2+...xk)-k*a

所以用字首和得到k和(x1+x2+...xk),就可以算出答案。

//計算不在a右側要到a的員工的答案(即在[1,a]內的員工

ans+=sum1[a]*a-sum2[a];

//計算在a右側要到a的員工的答案(即在[a+1,mid]內的員工

ans+=(sum2[mid]-sum2[a])-(sum1[mid]-sum1[a])*a

要到b的員工同理,加起來就可以得到答案了。

std:

#include #define n 100000

using namespace std;

typedef long long ll;

ll n, q, ans;

ll sum1[n+10], sum2[n+10];

int main()

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

sum1[i]+=sum1[i-1], sum2[i]+=sum2[i-1];

for (int i=1, a, b, mid; i<=q; i++)

return 0;

}

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

張經理的員工 題意很清楚,這裡不再贅述。這裡積累了一些經驗,以後遇到這種數級的資料和多組輸入的要求,基本就是預處理,打表,字首和一類的,不要想著套迴圈了,一般都會超時。預處理所有小於等於i位置的員工個數cpre i 所有小於等於i位置的員工下標之和pre i 預處理所有大於等於i位置的員工個數cfp...

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

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

超過經理收入的員工

create table employee id number 10 primary key,name varchar 10 not null salary number 10 managerid number 10 insert into employee values 1 jon 70000,3...