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 中的...