傳送門
以後序列上的問題可以想一想倍增。。
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 os
[i][
j]
pos[i][j]
pos[i]
[j]表示從i
ii跳2
j2^j
2j輪後的位置。
d is
_a[i
][j]
dis\_a[i][j]
dis_a[
i][j
]表示從i
ii跳2
j2^j
2j輪a
aa所走的總路程。
b
bb的路程用總路程減去a
aa的路程即可。
最近點和次近點用set
setse
t查一查,要注意距離相同時按照海拔從小到大排。
#include
#define ll long long
#define re register
#define cs const
#define pii std::pair
#define mp std::make_pair
#define se second
#define fi first
cs int n=
1e5+
10,oo=
1e9+
7,log=17;
namespace io
template
<
typename t>
inline t get()
while
(isdigit
(ch)
) x=
((x+
(x<<2)
)<<1)
+(ch^48)
,ch=gc(
);return f?x:
-x;}
inline
intgi()
inline ll gl()
}using io::gi;
using io::gl;
inline
intmin
(int x,
int y)
inline
void
min(
int&x,
int y)
int n,m,sa[n]
,sb[n]
,pos[n]
[log]
,ans1=1;
pii h[n]
;ll dis_a[n]
[log]
,dis_b[n]
,dis[n]
[log]
,x_0;
double quo;ll suma,sumb;
std::set s;
std::set
::iterator it;
inline
intpre
(cs pii &h)
inline
intsuf
(cs pii &h)
std::vector x;
inline
bool
cmp(cs pii &a,cs pii &b)
intmain()
for(
int re j=1;
(1<<=n;
++j)
for(
int re i=
1;i<=n;
++i)
if(pos[pos[i]
[j-1]]
[j-1])
pos[i]
[j]=pos[pos[i]
[j-1]]
[j-1],
dis[i]
[j]=dis[pos[i]
[j-1]]
[j-1
]+dis[i]
[j-1],
dis_a[i]
[j]=dis_a[pos[i]
[j-1]]
[j-1
]+dis_a[i]
[j-1];
x_0=gl(
),quo=oo;
for(
int re i=
1,now;i<=n;
++i)
printf
("%d\n"
,ans1);
m=gi()
;for
(int re i=
1;i<=m;
++i)
}
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 ...
NOIP2012 開車旅行
小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為 h i 城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即 d h i h j 旅行過程...