BZOJ4456 旅行者(最短路,分治)

2022-03-20 07:12:51 字數 2223 閱讀 1118

bzoj

小y來到了乙個新的城市旅行。她發現了這個城市的布局是網格狀的,也就是有n條從東到西的道路和m條從南到北

的道路,這些道路兩兩相交形成n×m個路口 (i,j)(1≤i≤n,1≤j≤m)。她發現不同的道路路況不同,所以通過不

同的路口需要不同的時間。通過調查發現,從路口(i,j)到路口(i,j+1)需要時間 r(i,j),從路口(i,j)到路口(i+1

,j)需要時間c(i,j)。注意這裡的道路是雙向的。小y有q個詢問,她想知道從路口(x1,y1)到路口(x2,y2)最少需要

花多少時間。

第一行包含 2 個正整數n,m,表示城市的大小。

接下來n行,每行包含m?1個整數,第i行第j個正整數表示從乙個路口到另乙個路口的時間r(i,j)。

接下來n?1行,每行包含m個整數,第i行第j個正整數表示從乙個路口到另乙個路口的時間c(i,j)。

接下來一行,包含1個正整數q,表示小y的詢問個數。

接下來q行,每行包含4個正整數 x1,y1,x2,y2,表示兩個路口的位置。

輸出共q行,每行包含乙個整數表示從乙個路口到另乙個路口最少需要花的時間。

2 26 4

1 1 2 2

1 2 2 1

\(zjoi\)上講得題目

感覺很有意思

每次處理當前矩陣內的詢問

將\(x,y\)兩軸中較長的分成兩半,使得矩陣盡可能「方」

如果乙個詢問的兩個點跨越了這個中線,

則意味著答案一定經過了中線上的某個點

於是對中線上每個點跑一邊對短路,

暴力更新答案

複雜度不會證明

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define rg register

#define max 111111

inline int read()

const int inf=100000000;

int n,m,q;

int dis[max];

int x[max],y[max],ans[max];

bool vis[max];

int bh(int i,int j)

struct linee[200000];

int h[max],cnt=1;

inline void add(int u,int v,int w)

;h[u]=cnt++;

e[cnt]=(line);h[v]=cnt++;

}struct node;

bool operator<(node a,node b)

void dijkstra(int s,int lx,int ly,int rx,int ry)

); for(int i=lx;i<=rx;++i)

for(int j=ly;j<=ry;++j)

dis[bh(i,j)]=inf,vis[bh(i,j)]=false;

while(!q.empty()));}

}}struct queryq[max],tmp[max];

void work(int lx,int rx,int ly,int ry,int l,int r)

int cntl=l-1,cntr=r+1;

for(int i=l;i<=r;++i)

for(int i=l;i<=r;++i)q[i]=tmp[i];

work(lx,mid-1,ly,ry,l,cntl);

work(mid+1,rx,ly,ry,cntr,r);

}else

int cntl=l-1,cntr=r+1;

for(int i=l;i<=r;++i)

for(int i=l;i<=r;++i)q[i]=tmp[i];

work(lx,rx,ly,mid-1,l,cntl);

work(lx,rx,mid+1,ry,cntr,r);

}}int main()

; }

memset(ans,63,sizeof(ans));

work(1,n,1,m,1,q);

for(int i=1;i<=q;++i)printf("%d\n",ans[i]);

return 0;

}

GXOI GZOI2019 旅行者 (最短路)

給定乙個有向圖,其中一些頂點為關鍵點。求這些關鍵點兩兩之間最小距離。考試時沒怎麼想寫了50分暴力走了。以為是什麼強連通分量的解法,結果就是個最短路。直接從關鍵點跑一次最短路dis 0 再把圖反向在跑一次最短路dis 1 跑最短路的時候記錄起點col 0 1 那麼最後直接列舉一條邊 x,y,w 當co...

GXOI GZOI2019 旅行者 (最短路)

給定乙個有向圖,其中一些頂點為關鍵點。求這些關鍵點兩兩之間最小距離。考試時沒怎麼想寫了50分暴力走了。以為是什麼強連通分量的解法,結果就是個最短路。直接從關鍵點跑一次最短路dis 0 再把圖反向在跑一次最短路dis 1 跑最短路的時候記錄起點col 0 1 那麼最後直接列舉一條邊 x,y,w 當co...

bzoj 1614 二分 最短路

題意 找一條將1號和n號 線桿連起來的路徑,其餘的 線桿並不一定要連入 網路。電信公司最終同意免費為fj鏈結k對由fj指定的 線桿。對於此外的那些 線,要求最大邊最小 明顯的二分答案,因為只要求1號和n號連起來,其他點不要求,所以跑最短路即可 對於二分出mid,我們check時,找到1號到n號的最短...