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

2021-10-05 16:52:50 字數 2449 閱讀 6318

張經理的公司的辦公室長達100000公尺,從最左端開始每間隔1公尺都有乙個工位(從第1公尺開始有工位),位於第i公尺的工位稱為i號工位,且這些工位都在一條水平線上。他有n個員工,每個員工分別位於xi號工位上(不同員工可能位於同乙個工位)。

現在張經理想把員工聚集在某兩個工位上,他有q套方案(每套方案包含兩個工位號,兩個工位號可能相同),他想知道對於每套方案,所有員工都到達兩個工位中的某乙個所需走的最短路徑之和是多少。

輸入描述:

第一行輸入兩個正整數n, q

第二行輸入n個正整數xi,分別代表第i個員工的工位

之後q行每行輸入兩個整數a,b,代表該套方案要求的兩個集合位置

(1<=n,q,xi,a,b<=10^5)

輸出描述:

對於每套方案,輸出乙個整數代表答案,每個答案獨佔一行

示例1輸入

複製3 2

1 3 5

1 42 1

輸出複製24

預處理/二分

因為給出的查詢次數是1e5,所以時間複雜度不能高於log級別,簡述一種o(1)查詢的做法(沒用二分):因為給出的查詢次數是1e5,所以時間複雜度不能高於log級別,簡述一種o(1)查詢的做法(沒用二分):

每次查詢給出的a和b,為了使得答案盡可能的小每次查詢給出的a和b,為了使得答案盡可能的小

那麼a左邊的員工應該前往a,b右邊的員工應該前往b那麼a左邊的員工應該前往a,b右邊的員工應該前往b

a和b中間的員工,根據距離a和b的距離分情況討論(其實不需要討論),接著往下看a和b中間的員工,根據距離a和b的距離分情況討論(其實不需要討論),接著往下看

直接根據樣例解釋吧,容易理解:直接根據樣例解釋吧,容易理解:

員工位置分別是1,3,5員工位置分別是1,3,5

第一次查詢a = 1,b = 4,所以位於1位置的前往1,位於5位置的前往4第一次查詢a=1,b=4,所以位於1位置的前往1,位於5位置的前往4

位於a和b中間的位置有2,3,如果每個位置都有人,那位於2位置的一定會前往1,位於3位置的一定會前往4位於a和b中間的位置有2,3,如果每個位置都有人,那位於2位置的一定會前往1,位於3位置的一定會前往4

思路就是這麼個思路,怎樣預處理呢?思路就是這麼個思路,怎樣預處理呢?

預處理所有小於等於i位置的員工個數cpre[i], 所有小於等於i位置的員工下標之和pre[i]預處理所有小於等於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

距離還是直接o(1)處理,你可以理解成在[a,b]中間切一刀,左半部分去a,右半部分去b,細節就不再簡述距離還是直接o(1)處理,你可以理解成在[a,b]中間切一刀,左半部分去a,右半部分去b,細節就不再簡述

**

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const ll maxn=1e5+10;

ll a,b[maxn]

;ll low[maxn],clow[maxn]

;ll high[maxn],chigh[maxn]

;int main(

) ll sum=0,sum2=0;

for(i=1;i<=100000;i++)

low[i]

=sum;

clow[i]

=sum2;

} sum=0;

sum2=0;

for(i=100000;i>=1;i--)

high[i]

=sum;

chigh[i]

=sum2;

} ll x,y;

for(i=0;isum+=low[x]*x-clow[x]

; sum+=chigh[y]-high[y]*y;

if(y-x>1)

cout <<

sum<< endl;

}}

2020西工大校賽 C王國(LCA)

典型的樹上求兩點間距離最大值,lca的做法 這題要求同乙個陣營,不妨先將同屬乙個陣營的先存進陣列,之後每組進行比較 比較時取出深度最深的,因為這個一定是答案中兩點中的其中乙個答案,這是樹的性質,不妨可以想一想 includeusing namespace std typedef long long ...

張經理的員工 字首和

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

河工大校賽E 某科學的打麻將

時間限制 1 秒 記憶體限制 64 mb 提交 74 解決 11 提交 狀態 題目描述 過年打麻將果然是一項必備技能 霧 打麻將的起手式是整理好自己手中的牌,現在你有十三張牌 只可能出現一萬到九萬,一筒到九筒,一條到九條 你要把這些牌整理好,使得相同花色的牌必須在連續的唯一一段 即所有的 萬 要放在...