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