把ab各走一次算一步
f[i][j]表示i點跳2^j步走到的點
da[i][j]表示i點跳2^j步a走的路程
db[i][j]表示i點跳2^j步b走的路程
倒著掃一遍求從i點a走出一次走到的點toi,記錄da[i][0]。然後,我們把to[i]和i連邊
2.倒著掃一遍求從i ,b走出一次走到的點t,再列舉所有i的出邊,設邊的另一端為p,則p走「一步」就是走到了t了,記錄f[p][0]。同理,記錄db。
倍增,注意可能最後a可以多走一步。
。。。這道題主要是初始化難,其他隨便搞搞調調都行了。
#include
#define n 100010
#define inf 2147483647
#define ll long long
#define point(a) multiset::iterator
#define mod (ll)(1e9+7)
#define mem(a,b) memset(a,b,sizeof (a))
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
struct rel
e[n]
;ll n,i,j,k,t,m,disa,disb,ans,tot;
ll h[n]
,to[n]
,tt[n]
,f[n][20
],da[n][20
],db[n][20
],s,x,tail[n]
;//to -a
struct node};
multiset a;
long
double rat,cmp;
void
redouble()
return;}
void
add(ll u,ll v)
void
choose_go
(char p , ll s,ll t,ll d)
else}}
void
init()
);point
(node) it = a.
find
((node)
),l=it,r=it;
point
(node) rbegin = a.
end(
),begin = a.
begin()
,end=a.
end();
--rbegin;
for(ll j=
1;j<=
2;j++
)++r;
node x,y;
x=y=
(node)
;for
(point
(node) p =l;p!=r;
++p)
if(p!=it);if
(now < x)
else
if(now < y) y=now;
}//to , pre , da
if(y.id!=inf)
choose_go
('a'
,i,y.id,y.h);}
a.clear()
;for
(i=n;i>
0;i--))
;point
(node) it = a.
find
((node)
),l=it,r=it;
--l,
++r;
ll decx = it == a.
begin()
? inf : h[i]
- l->h;
ll decy = r == a.
end(
)? inf : r->h - h[i];if
(decx == inf && decy == inf)
continue;if
(decx < decy || decx==decy )
choose_go
('b'
,i,l->id,decx)
;else
if(decx > decy)
choose_go
('b'
,i,r->id,decy)
;//***
}redouble()
;return;}
void
drive
(ll s,ll x)
if(to[p])if
(disa + disb + da[p][0
]<=x) disa +
= da[p][0
];return;}
intmain()
else
if(rat == cmp)
}printf
("%lld\n"
,ans)
;scanf
("%lld"
,&m)
;while
(m--
)return0;
}
NOIP2012提高組 開車旅行
這題倍增。當拿到a陣列時,我們便記錄他的位置併排個序 再用乙個陣列 然後,我們就將其變成乙個鍊錶的樣子。由於題目要求每次這能從左邊走到右邊,所以我們便從1開始列舉到n,ps luogu的也a了 上標 include include define ll long long define n 10001...
NOIP2012提高組 開車旅行
題目 洛谷p1081 vijos p1780 codevs1199。題目大意 有n座海拔高度不相同的城市 編號1 n 兩城市的距離就是兩城市海拔之差。規定每次只能從編號小的城市走到編號大的城市。現在有a和b開車旅行,a每次只開到離當前城市第二近的城市 必須是可以走的,且若兩個城市與該城距離相等,海拔...
NOIP2012提高組 開車旅行 題解
題目連線 題目描述 小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為hi,城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即d i,j h...