Luogu P3644 八鄰旁的橋

2022-09-21 12:09:11 字數 1045 閱讀 1550

luogu 3644 八鄰旁的橋

\(\quad\)首先考慮 \(k=1\) 的情況,其實抽象一下很像之前做的中位數的題,答案就是所有位置的中位數。

\(\quad\)再考慮 \(k=2\) 的情況,那麼無非就是將一條河分成兩邊,一邊走這個\(\quad\)橋,另一邊走那個橋。於是我們列舉分割點,這樣就轉換成了第一種情況。

\(\quad\)但是如何求第一種情況的路程和?

\(\quad\)我們可以想象乙個數軸上,橋在乙個點,那麼總距離就是橋到左邊點的總距離加上橋到右邊點的總距離,一旦決定了分割點,那麼橋就是那一塊所有座標的中位數。

\(\quad\)因為居民的位置滿足單調性,於是我們可以從左到右掃一遍預處理左邊塊的答案,再從右到左掃一遍預處理右邊塊的答案。

\(\quad\)每加入乙個居民,就是加入了 \(2\) 個點,我們需要維護當前所有數的中位數和小於中位數的和,和大於中位數的和。都說了每次只加入 \(2\) 個點,也就是我們只用考慮這 \(2\) 個點影響,那就好維護多了,這裡維護的操作很明顯可以用平衡樹做,但是也可以用對頂堆做,操作的時候可以記錄比中位數小的數的個數和總和,比中位數大的數的個數和總和,或者也可以直接記錄答案。

#include#define int long long

using namespace std;

const int maxn=1000010;

struct node

p[maxn];

bool cmp(node a,node b)

} if(k==1)

coutsum[0][i]=s2-s1;

} while(q1.size()) q1.pop();

while(q2.size()) q2.pop();

s1=s2=0;

for(int i=tot;i>=1;i--)

sum[1][i]=s2-s1;

} long long anss=1e18;

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

cout<} return 0;

}

P3644 八鄰旁之橋 題解

portal 首先注意到家和辦公室在河同側的是方案唯一的 就直接走 先算到答案裡面去。然後剩下來的都是被分在兩岸的。顯然兩岸哪個是家哪個是辦公室不重要。我們設它們的位置為 l leq r 於是如果通過的橋為 a 不難列出走的路程的式子 l a r a 1 我當時就是沒想到把式子列出來,進一步通過 號...

APIO2015 八鄰旁之橋

傳送門 題目大意 兩條水平的直線,距離為 1 給定 n 對座標,座標是在某一條直線上的某乙個位置,你可以建立 k 豎直的直線 k leq 2 要使得每對座標只沿著直線移動從第乙個座標到第二個座標的距離和最小。題解首先可以求出在一對座標在同一條水平直線上的代價,對於需要跨越的,都經過了豎直直線的 1 ...

APIO2015 八鄰旁之橋

傳送門 這道題看起來十分的不可做 可能是我數學太差智商太低了orz。首先如果乙個人的家和辦公室在同一側那就完全不用考慮,把結果記下來就行。然後我們先考慮k 1的情況。因為只能建1座橋,那麼我們發現 除去過橋乙個單位長度不算 答案就是sigma abs ai x abs bi x 其中ai,bi表示區...