BZOJ4071 八鄰旁之橋(線段樹)

2022-03-20 08:16:29 字數 1901 閱讀 1357

bzoj許可權題,洛谷鏈結

既然\(k<=2\)

那麼,突破口就在這裡

分類討論

①\(k=1\)

這。。。不就是中位數嗎。。。。

直接把所有起點重點排個序,

算下中位數就行啦

②\(k=2\)

似乎不好搞了

orz zsy dalao

我太弱了

我就是乙個vegetable chicken

zsy看一眼就會做

所以:#define brige bridge

首先,我們來看一看,如果有兩座橋,

乙個人會怎麼動呢?

如果橋在他所移動的橫向區間內

那麼,一定會過這座橋,距離為\(dis(qi-ti)+1\)

如果,沒有橋在他的區間內

他就要先走到橋,再從橋走過來

此時距離為\(abs(qi-brige)+abs(ti-brige)+1\)

這個東西再結合影象化個簡

等於\(2abs(\frac-brige)+1\)

所以,這個人走的橋一定是離\(\frac\)較近的橋

因此,把所有人按照\(\frac\)排序之後

開始列舉在哪個位置割開

然後左邊的都走左邊的橋

右邊的都走右邊的橋

拆成了兩邊之後就是\(k=1\)的情況了

但是因為是動態維護區間的中位數

所以要找個東西來維護

權值線段樹,平衡樹都是可以的

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define max 250000

#define lson (now<<1)

#define rson (now<<1|1)

inline int read()

struct nodew[max];

bool operator<(node a,node b)

void modify(int now,int l,int r,int pos,int ww)

ll queryv(int now,int l,int r,int al,int ar)

int querys(int now,int l,int r,int al,int ar)

}t[2];

int main()

else if(p==1)swap(s,t);

++tot;a[tot]=s;b[tot]=t;s[++top]=s;s[++top]=t;

} sort(&s[1],&s[top+1]);

int g=s[top/2];

for(int i=1;i<=top;++i)ans+=abs(g-s[i]);

printf("%lld\n",ans+tot);

return 0;

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

ans++;s[++top]=s;s[++top]=t;

if(s>t)swap(s,t);

w[++cnt]=(node);

} if(!cnt)

sort(&w[1],&w[cnt+1]);

sort(&s[1],&s[top+1]);

top=unique(&s[1],&s[top+1])-s-1;

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

long long sum=1e18;

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

printf("%lld\n",ans+sum);

return 0;

}

BZOJ 4071 巴鄰旁之橋

bzoj 4071傳送門 首先算出能提前算的貢獻 k 1 肯定選中間的點,小學數學 k 2 對於每對 x,y 一定選離 x y 2 近的橋 也就是說將 x,y 按 x y 2 的值排序後一定恰有乙個分割點使得兩邊選擇不同的橋!考慮如何如何快速列舉所有分割點時的答案 需要支援插入 刪除 求中位數及兩邊...

BZOJ4071 APIO2015 八鄰旁之橋

bzoj4071 apio2015 八鄰旁之橋 這個題也變成了許可權題,不是很懂為什麼。反正沒錢氪金。這裡附上洛谷的題面 洛谷p3644 apio2015 八鄰旁之橋 一條東西走向的穆西河將巴鄰旁市一分為二,分割成了區域 aa 和區域 bb。每一塊區域沿著河岸都建了恰好 1000000001 棟的建...

4071 Apio2015 巴鄰旁之橋

一條東西走向的穆西河將巴鄰旁市一分為二,分割成了區域 a 和區域 b。每一塊區域沿著河岸都建了恰好 1000000001 棟的建築,每條岸邊的建築都從 0 編號到 1000000000。相鄰的每對建築相隔 1 個單位距離,河的寬度也是 1 個單位長度。區域 a 中的 i 號建築物恰好與區域 b 中的...