CF1715E Long Way Home题解
题解
注意到
对于
暴力递推的复杂度是
我们定义出
那么我们就是要求直线
对于
其中
代码实现上,要注意的是:1.转移的第一维只涉及两个阶段,可用滚动数组减小空间常数。2.在用
AC code
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
const int inf=1e15;
int n,m,k;
int ver[N],edge[N],head[N],Next[N],d[N],D[N],vis[N],tot,u,v,w;
int rt,sz,ans;
priority_queue<pair<int,int> >q;
struct Line {
int k,b;
}a[N];
struct node {
int ls,rs,mx;
}t[N<<2];
bool check(int i,int j,int x) {
if(a[i].k*x+a[i].b-a[j].k*x-a[j].b>0) return false;
return true;
}
void Insert(int &p,int L,int R,int pos) {
if(!p) p=++sz;
if(check(pos,t[p].mx,L)&&check(pos,t[p].mx,R)) {
t[p].mx=pos;
return;
}
if(!check(pos,t[p].mx,L)&&!check(pos,t[p].mx,R)) return;
int mid=L+R>>1;
if(check(pos,t[p].mx,mid)) swap(pos,t[p].mx);
if(check(pos,t[p].mx,L)) Insert(t[p].ls,L,mid,pos);
if(check(pos,t[p].mx,R)) Insert(t[p].rs,mid+1,R,pos);
}
void query(int p,int L,int R,int x) {
if(!p) return;
if(check(t[p].mx,ans,x)) ans=t[p].mx;
if(L==R) return;
int mid=L+R>>1;
if(x<=mid) query(t[p].ls,L,mid,x);
else query(t[p].rs,mid+1,R,x);
}
void add(int x,int y,int z) {
ver[++tot]=y;
edge[tot]=z;
Next[tot]=head[x];
head[x]=tot;
}
void dijkstra() {
for(int i=1;i<=n;i++) {
vis[i]=0;
q.push(make_pair(-d[i],i));
}
while(!q.empty()) {
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=Next[i]) {
int y=ver[i],z=edge[i];
if(d[y]>d[x]+z) {
d[y]=d[x]+z;
q.push(make_pair(-d[y],y));
}
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=m;i++) {
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
for(int i=1;i<=n;i++) d[i]=inf;
d[1]=0;
dijkstra();
a[0].k=0,a[0].b=inf;
for(int i=1;i<=k;i++) {
for(int j=1;j<=n;j++) {
a[j].k=-2*j,a[j].b=d[j]+j*j;
Insert(rt,1,n,j);
}
for(int j=1;j<=n;j++) {
ans=0;
query(rt,1,n,j);
D[j]=min(d[j],-2*ans*j+d[ans]+ans*ans+j*j);
}
for(int j=1;j<=n;j++) d[j]=D[j];
dijkstra();
}
for(int i=1;i<=n;i++) cout<<d[i]<<" ";
return 0;
}
本文作者:2021hych
本文链接:https://www.cnblogs.com/2021hych/p/18013530
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步