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號的最短...