IOI2018 高速公路收費 二分查詢 bfs

2022-05-08 03:18:07 字數 1323 閱讀 8683

ioi2018highway

我們設起點為$s$,終點為$t$。

首先需要一次詢問將邊權都設為$a$來知道$s$到$t$的最短路。然後我們可以用二分來找到乙個處於$s$到$t$最短路上的點:每次將編號在$[0,mid]$的點的所有出邊設為$b$,其他的設為$a$。如果得到的最短路不變,那麼顯然編號在$[mid+1,n-1]$的點有處於$s$到$t$最短路上的點,反之編號在$[0,mid]$的點有處於$s$到$t$最短路上的點。我們設找到的這個點為$x$,那麼$s$與$t$中一定有乙個點距離$x$較遠,我們設這個點為$s$。從$x$開始$bfs$,二分然後每次將$bfs$序的$[mid+1,n-1]$這些點的所有出邊設為$b$,其他邊設為$a$,這樣就能找到$s$,再從$s$開始$bfs$同樣二分$bfs$序找到$t$。這樣詢問次數是$3*log_^+1=52$,可以得到$90$分。

既然第一步可以二分找到最短路上的乙個點,那麼我們同樣也可以找到一條邊。每次將編號在$[0,mid]$的邊設為$b$其他邊設為$a$來找到最短路上的一條邊,對於這條邊的兩端點$(u,v)$顯然每個點到這兩個點的最短距離不同,我們按每個點到這兩個點的最短距離將離$u$更近的分為一部分,離$v$更近的分為另一部分,對於每部分還是二分$bfs$序來分別找到$s$和$t$,這樣最壞情況詢問次數為$1+log_^+2*log_^=50$,即可得到滿分。

#include"highway.h"

#include#include#include#include#define ll long long

using namespace std;

vectors[90010];

vectorto[90010];

int w[130010];

ll path;

queueq;

int dis_u[90010];

int dis_v[90010];

int que_u[90010];

int que_v[90010];

int cnt_u;

int cnt_v;

int s,t;

bool cmp_u(int x,int y)

else

}q.push(u[l]);

dis_u[u[l]]=1;

while(!q.empty())

else

}s=que_u[l];

l=1,r=cnt_v;

while(l>1;

for(int i=0;i(w,w+num));

if(path==value)

else

}t=que_v[l];

answer(s,t);

}

高速公路計重收費系統

系統概述 根據要求,在收費車道安裝收費車道低速高精度稱重系統,對所有過往車輛進行稱重,配合已有的收費系統,對過往車輛進行計重收費,同時根據 超限運輸車輛行駛公路管理規定 的要求進行超限檢測,對超限車輛進行加重收費的處罰,可有效控制超重車輛對公路路面的破壞。為了在收費站實現計重收費和超限檢測功能,在收...

IOI2018 機械娃娃

看到的時候感到很不可做,因為所有的開關都要狀態歸零。因此可以得到兩分的好成績。然後 yhx 12243 說 這不是線段樹優化建圖嗎?於是我獲得了啟發,會做了 還不是和上次一樣,通過提示做出這種互動題的?我還是太菜了 以下魔改自我的思考過程 一開始想對每乙個觸發器配一組開關決策下一步,然後聽說用線段樹...

ccf 高速公路

問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙個修高速公路的計畫。看了計畫後,國王發現,有些城市之間可以通過高速公路直接 不經過其他城市 或間接 經過乙個或多個其...