NOIP2012提高組 開車旅行

2021-09-10 03:41:11 字數 2591 閱讀 7814

把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...