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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=3482


題目大意

一張有向圖有正整數邊權也有xxx邊權。其中xxx可以取任何值(但是要注意所有的xxx邊必須長度相等),每次詢問求SSSTTT的可能最短路長度個數和它們的和。


解題思路

分層圖,第iii層第jjj個點表示SSSiii的最短路且經過了jjjxxx的邊方案,然后跑最短路。

現在我們定義fif_ifi?表示SSSEEE經過iii條邊xxx邊的最短路,然后設xxx邊的長度為xxx

那么經過iii條邊為最短路的情況當且僅當fi+i?xf_i+i*xfi?+i?x最小。那么我們可以定義若干條一次函數y=fi+i?xy=f_i+i*xy=fi?+i?x,那么就是一條以fif_ifi?為截距,iii為斜率的線。那么我們考慮y=fi+i?xy=f_i+i*xy=fi?+i?x為最短路的可能情況。

維護一個y=fi+i?xy=f_i+i*xy=fi?+i?x的凸包,維護一個單調隊列,讓剩下的線的兩兩之間的交點的xxx坐標遞增即可。

然后就可以算出第一問,對于第二問用等差數列計算即可。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<queue> #define ll long long #define p(a1,a2) ((a2)*n+a1) using namespace std; const ll N=510,M=10100,inf=1e18; struct node{ll to,next,w; }a[M*2]; struct line{double x,y; }l[N]; ll n,m,ls[N*N],f[N*N],tot,Q,num,ans,next[N]; double ata[N];bool v[N*N]; queue<ll> q; void addl(ll x,ll y,ll w) {a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w; } ll read() {ll x=0,f=1; char c=getchar();if(c=='x') return -1;while(!isdigit(c)) {if(c=='x')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return (!f)?-1:x; } void spfa(ll s) {memset(v,0,sizeof(v));memset(f,127,sizeof(f));q.push(s);v[s]=1;f[s]=0;while(!q.empty()){ll x=q.front();q.pop();ll c=(x-1)/n;if(c==n) continue;for(ll i=ls[(x-1)%n+1];i;i=a[i].next){ll y=p(a[i].to,c+(a[i].w==-1));if(f[x]+max(a[i].w,0ll)<f[y]){f[y]=f[x]+max(a[i].w,0ll);if(!v[y]){v[y]=1;q.push(y);}}}v[x]=0;}return; } double gtan(double x1,double y1,double x2,double y2) {return (y2-y1)/(x1-x2);} int main() {n=read();m=read();for(ll i=1;i<=m;i++){ll x,y,w;x=read();y=read();w=read();if(x==y) continue;addl(x,y,w);}Q=read();while(Q--){ll s=read(),t=read();bool flag=0;spfa(p(s,0));for(ll i=0;i<=n;i++)if(f[p(t,i)]<inf){flag=1;break;}if(!flag) {printf("0 0\n");continue;}if(f[p(t,0)]>inf) {printf("inf\n");continue;}ll num=0,sum=0,cnt=0;for(ll i=n;i>=0;i--){if(f[p(t,i)]>inf) continue;while(cnt>=1&&gtan(l[cnt].x,l[cnt].y,i,f[p(t,i)])<=ata[cnt]) cnt--;l[++cnt]=(line){i,f[p(t,i)]};if(cnt>1) ata[cnt]=gtan(l[cnt-1].x,l[cnt-1].y,l[cnt].x,l[cnt].y);}for(ll i=1;i<cnt;i++){ll L=(int)ata[i]+1,R=(int)ata[i+1];if(L<=R) sum+=(ll)(L*l[i].x+l[i].y+R*l[i].x+l[i].y)*(R-L+1)/2;}num=(ll)ata[cnt];if(ata[cnt]!=num||cnt==1) num++,sum+=f[p(t,0)];printf("%lld %lld\n",num,sum);} }

總結

以上是生活随笔為你收集整理的bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。