張經理的公司的辦公室長達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 提交 狀態 題目描述 過年打麻將果然是一項必備技能 霧 打麻將的起手式是整理好自己手中的牌,現在你有十三張牌 只可能出現一萬到九萬,一筒到九筒,一條到九條 你要把這些牌整理好,使得相同花色的牌必須在連續的唯一一段 即所有的 萬 要放在...