簡單的圖論題。
第一問顯然答案是最短路。
第二問中,由於有旅行路程最短的限制,旅行的過程一定在最短路dag上。
建立最短路dag。(dag的條件非常重要)
每條鐵路會被不在最短路dag上的所有邊分割成若干個片段。
考慮dp,設\(f_i\)表示從源點到達\(i\)的最小代價。
可以列舉\(i\)所在的所有鐵路線上的點\(j\)進行轉移。
把被分割的鐵路線進行字首和,設為\(s\)。
則\(f_i=\min(f_j+(s_i-s_j)^2)\)
直接做時間複雜度是\(o(n^2)\)的。
73分**如下:
#includeusing namespace std;
#define int long long
#define n 1000010
int n,m,h[n],w[n*2],v[n*2],nxt[n*2],ec,d[n],vi[n],tp,st[n],du[n],ct,cc,cv,po[n],ii[n];
struct nn;
struct hl;
int operator <(nn x,nn y)
priority_queueq;
queuetq;
vectors[n],t[n],g[n],vt[n],p[n],id[n];
void dij());
for(int i=2;i<=n;i++)
d[i]=1e18;
while(!q.empty()));
} }}
void tt() }}
void dd()
c++;
} }}void add(int x,int y,int z)
signed main()
scanf("%lld",&a);
g[i].push_back(a);
} for(int i=1;i<=m;i++)
for(int j=0;j+1但是發現\(f_j+(s_i-s_j)^2=f_j+s_i^2-2*s_i*s_j+s_j^2=(s_i^2)+(-2s_i)s_j+(f_j+s_j^2)\)
後面是直線方程,顯然可以使用凸包維護。
維護\(m\)個凸包,按照拓撲序列舉當前點。
列舉當前點所在鐵路(設為陣列\(a\)),在\(a\)對應的凸包上查詢得到當前點的\(f\)
然後把查詢得到結果插入\(a\)對應的凸包中。
由於\(s\)是單調遞增的,所以可以線性維護凸包。
時間複雜度\(o(m\log_2n)\),瓶頸在最短路。
#includeusing namespace std;
#define int long long
#define n 1000010
int n,m,h[n],w[n*2],v[n*2],nxt[n*2],ec,d[n],vi[n],tp,st[n],du[n],ct,cc,cv,po[n],ii[n];
struct nn;
struct noa[n];
int va(no x,int y)
int cp(no j,no k,no i)
struct hl
while(s.size()>1&&cp(s[s.size()-2],s.back(),x))
s.pop_back();
s.push_back(x);
} int qu(int x)
return -2*s.back().x*x+s.back().y+x*x;
}}bl[n];
int operator <(nn x,nn y)
priority_queueq;
queuetq;
vectors[n],t[n],g[n],vt[n],p[n],id[n];
void dij());
for(int i=2;i<=n;i++)
d[i]=1e18;
while(!q.empty()));
} }}
void tt() }}
void dd()
c=0;
for(int j=0;jc++;
} }}void add(int x,int y,int z)
signed main()
scanf("%lld",&a);
g[i].push_back(a);
} for(int i=1;i<=m;i++)
for(int j=0;j+1add(g[i][j],g[i][j+1],vt[i][j]);
dij();
for(int i=1;i<=m;i++)
for(int k=la;k<=j;k++)
s[cc].resize(p[cc].size());
for(int k=0;k+1s[cc][k+1]=s[cc][k]+vt[i][k+la];
la=j+1;
}} cc++;
for(int k=la;kp[cc].push_back(g[i][k]);
for(int k=la;ks[cc].resize(p[cc].size());
for(int k=0;k+1s[cc][k+1]=s[cc][k]+vt[i][k+la];
} printf("%lld ",d[n]);
memset(h,0,sizeof(h));
ec=0;
for(int i=1;i<=m;i++)
for(int j=0;j+1if(d[g[i][j+1]]==d[g[i][j]]+vt[i][j])
tt();
dd();
printf("%lld ",d[n]);
}
谷歌新doodle慶祝大都會藝術博物館151周年
據外媒報道,大都會藝術博物館 以下簡稱程式設計客棧met 是美國最大的藝術博物館,其擁有超200萬件可以追溯到5000年前的文物。當地時間周二是它的151周年紀念,谷歌也加入到了這場派對中,其doodle動畫塗鴉描繪了18件來自該博物館的藝術品。據了解,met的起源可追溯到1866年,當時一群在巴黎...
高校大都會使用的工具,課程錄播軟體哪個好?
很多朋友發現近幾年課程錄播越來越火了,網上的一些課程越來越多,雖然面對面教學模式更加好溝通和把握學生情緒,但是網路錄播課程就不受歡迎了嗎?不,是越來越受歡迎的,畢竟一些好的講課內容可以分享給更多更需要的朋友們,只是需要簡單的錄屏操作而已就能做到,使用課程錄播軟體順手就能做到,那麼我們應該怎樣去操作呢...
保險公司「大都會人壽」以新興企業態度應對大資料挑戰
大都會人壽是一家規模龐大的保險企業,在跨越美洲 歐洲以及亞洲的龐大市場當中擁有超過9000萬客戶。不過在本週三於紐約市舉辦的gigaom structure data大會的舞台上,該公司區域應用程式開發部門副總裁兼cio gary hoberman指出該公司在部署大資料應用程式時 更傾向於學習規模精...