NOIP 2012 開車旅行

2022-08-04 19:48:14 字數 987 閱讀 6944

傳送門

set+倍增。

這題是乙個高效模擬題,所以一般都要用一些比較高效的演算法,小a和小b的路線都是固定的,所以很容易想到倍增來高效查詢路線。

那麼設:

g[i][j]表示從i開始往後\(2^j\)輪,車開到的城市。

f[i][j][0]表示從i開始往後\(2^j\)輪,小a開車的路程。

f[i][j][1]表示從i開始往後\(2^j\)輪,小b開車的路線。

首先預處理出走一輪的路線,這個可以用set來實現。

然後倍增轉移。

對於第一問,直接暴枚每個點為起點,比較一下即可。

對於第二問,同理直接查詢。

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

#define n 100010

using namespace std;

int h[n],g[n][22],f[n][22][2],dis[n][2],to[n][2];

setq;

mapmp;

int gi()

void update(int x, int y)

} if(to[x][1] && dis[x][1]<=len) a+=dis[x][1];

}int main()

it++;

}if((++it)!=q.end())

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

for(int j=1; j<=20; j++)

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

len=gi();

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

printf("%d\n", ans);

m=gi();

while(m--)

return 0;

}

NOIp2012 開車旅行

傳送門 以後序列上的問題可以想一想倍增。s a i s b i sa i sb i sa i sb i 記錄在i ii這個位置讓a b a ba b開車到達的點。把a aa和b bb都跳一次稱為一輪。d is i j dis i j dis i j 表示從i ii跳2 j2 j 2j輪的總路程。p ...

Noip2012 開車旅行

小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為hi,城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即d i,j hi hj 旅行過程中...

NOIP2012 開車旅行

題目描述 小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的 城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為 hi,城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即 d i,j hi ...