日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UOJ #588. 图图的旅行

發(fā)布時(shí)間:2024/4/15 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UOJ #588. 图图的旅行 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目描述】: 圖圖計(jì)劃去Bzeroth 的精靈王國(guó)去旅游,精靈王國(guó)由n 座城市組成,第i 座城市有3 個(gè)屬性x[i],w[i],t[i]。在精靈王國(guó)的城市之間穿行只能依靠傳送陣,第i 座城市的傳送陣可以將圖圖從城市i 傳送到距離城市i 不超過(guò)w[i]的任意一個(gè)城市,并需要t[i]的時(shí)間完成傳送。現(xiàn)在圖圖知道了每個(gè)城市的坐標(biāo)x[i],想知道他從城市s 到城市t 的最小時(shí)間。這么難的問(wèn)題圖圖當(dāng)然不會(huì)做了,他想讓你幫幫他,你能解決這個(gè)問(wèn)題嗎?【輸入描述】: 第一行包含3 個(gè)正整數(shù)n、s、t,表示城市個(gè)數(shù),起點(diǎn)城市和終點(diǎn)城市。第二行包含n 個(gè)整數(shù)x[i],表示第i 座城市的坐標(biāo)。第三行包含n 個(gè)整數(shù)w[i],表示第i 座城市的傳送距離。第四行包含n 個(gè)整數(shù)t[i],表示第i 座城市的傳送時(shí)間。【輸出描述】: 請(qǐng)輸出從城市s 到城市t 的最小時(shí)間,保證至少存在一組合法解。【樣例輸入】: 7 3 7 -1 0 1 2 3 5 10 11 0 1 1 4 10 2 3 1 1 1 2 4 5 【樣例輸出】: 7 【樣例說(shuō)明】: 路線為3 → 4 → 5 → 1 → 7,時(shí)間之和為7。【時(shí)間限制、數(shù)據(jù)范圍及描述】: 時(shí)間:1s 空間:256M對(duì)于30%的數(shù)據(jù),1≤n≤2501,所有的t[i]均相等。對(duì)于60%的數(shù)據(jù),1≤n≤2501。對(duì)于100%的數(shù)據(jù),1≤n≤152501,0≤w[i],t[i],|x[i]|≤10^9,保證x[i]嚴(yán)格遞增。本題的關(guān)鍵是要看出每個(gè)點(diǎn)所能到達(dá)的點(diǎn)是一個(gè)區(qū)間,所以直接用線段樹(shù)的思想來(lái)建邊,每次只要將一個(gè)點(diǎn)連上它所對(duì)應(yīng)的區(qū)間即可. 然后線段樹(shù)內(nèi)部就父親連向兒子,這樣點(diǎn)數(shù)雖增多了,但是邊數(shù)卻減少為nlogn,最后再跑一邊dijkstra就行了.Code: #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<ctime> using namespace std; const int N=1000005; int n,cnt,head[N*4],X[N],D[N],T[N],wl[N],wr[N]; long long dis[N*4]; bool vis[N*4]; struct Node{int v,nxt,w; }edge[N*8]; struct node{int u;long long d; }; bool operator<(const node &p,const node &q){return p.d>q.d; } priority_queue<node> q; void add(int u,int v,int w){cnt++;edge[cnt].v=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt; } void build(int o,int l,int r){if (l==r){add(o+n,l,0);return;}int mid=(l+r)>>1;build(o<<1,l,mid);build(o<<1|1,mid+1,r);add(o+n,(o<<1)+n,0);add(o+n,(o<<1|1)+n,0); } void update(int o,int l,int r,int u,int ql,int qr,int w){if (l>=ql && r<=qr){add(u,o+n,w);return;}int mid=(l+r)>>1;if (ql<=mid){update(o<<1,l,mid,u,ql,qr,w);}if (qr>=mid+1){update(o<<1|1,mid+1,r,u,ql,qr,w);} } void dijkstra(int s){for(int i=1;i<N*4;i++){dis[i]=1e18;}dis[s]=0;q.push((node){s,0});while (!q.empty()){int u=q.top().u;q.pop();if (vis[u]){continue;}vis[u]=1;for (int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;if (dis[v]>dis[u]+edge[i].w){dis[v]=dis[u]+edge[i].w;if (!vis[v]){q.push((node){v,dis[v]});}}}} } int main(){int s,t;scanf("%d%d%d",&n,&s,&t);for(int i=1;i<=n;i++){scanf("%d",&X[i]);}for(int i=1;i<=n;i++){scanf("%d",&D[i]);}for(int i=1;i<=n;i++){scanf("%d",&T[i]);}build(1,1,n);for (int i=1;i<=n;i++){wl[i]=lower_bound(X+1,X+1+n,X[i]-D[i])-X;wr[i]=upper_bound(X+1,X+1+n,X[i]+D[i])-X-1;}for (int i=1;i<=n;i++){update(1,1,n,i,wl[i],wr[i],T[i]);}dijkstra(s);printf("%lld\n",dis[t]);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/ukcxrtjr/p/11556592.html

總結(jié)

以上是生活随笔為你收集整理的UOJ #588. 图图的旅行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。