当前位置: 首页 > news >正文

wzy

题目询问 $ s $ 到 $ t $ 的最短距离,我们可以发现我们就没法跑记录二维是否用过传送的方法。

可以发现 $ s->t $ 的最短距离可以看做 $ s->x->y->t $ ,$ x,y $ 为随便选的两个点,设 $ dis1[i] $ 为 $ s $ 到 $ i $ 的最短距离 ,$ dis2[i] $ 为 $ t $ 到 $ i $ 的最短距离 ,那么答案就是 $ \min\limits_{1\leq x \leq n,1\leq y \leq n} dis1[x]+(x-y)^2+dis2[y] $ 。

建两个图,一个正图,一个反图,跑两遍最短路求出 $ dis1,dis2 $ ,然后 $ n^2 $ 枚举每一个点,我们就有了 $ O(n^2) $ 的做法,考虑优化。

观察答案的式子,我们可以给它化简成 \(dis1[x]+x^2-2xy+dis2[y]+y^2\) 的形式,因为我们 $ O(n) $ 枚举 $ x $ ,所以每次枚举 $ dis1[x]+x^2 $ 都是一个定值,我们只要求 $ dis2[y]+y^2-2xy $ 的最小值就好,把每一个 $ y $ 当成一条线段,那么它的斜率就是 $ -2x $,b就是 $ dis2[y]+y^2 $ ,我们就可以直接套一个李超跑过去。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
constexpr int N=2e5+10;
int head1[N],cnt1,head2[N],cnt2,dis1[N],dis2[N],n,m,S,T,vis[N],s[N<<2],k[N],b[N];
struct edge{int next,to,w;}e1[N<<1],e2[N<<1];
inline int in(){int k=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+c-'0',c=getchar();return k*f;
}
void add1(int u,int v,int w){e1[++cnt1].next=head1[u],e1[cnt1].to=v,e1[cnt1].w=w,head1[u]=cnt1;
}
void add2(int u,int v,int w){e2[++cnt2].next=head2[u],e2[cnt2].to=v,e2[cnt2].w=w,head2[u]=cnt2;
}
struct node{int val,u;};
inline int operator>(node a,node b){return a.val>b.val;};
void dij1(int x){memset(dis1,0x3f,sizeof(dis1));memset(vis,0,sizeof(vis));dis1[x]=0;priority_queue<node,vector<node>,greater<node> > q;q.push({0,x});while(!q.empty()){node u=q.top();q.pop();if(vis[u.u]) continue;vis[u.u]=1;for(int i=head1[u.u];i;i=e1[i].next){int v=e1[i].to;if(dis1[v]>dis1[u.u]+e1[i].w){dis1[v]=dis1[u.u]+e1[i].w;if(!vis[v]) q.push({dis1[v],v});}}}
}
void dij2(int x){memset(dis2,0x3f,sizeof(dis2));memset(vis,0,sizeof(vis));dis2[x]=0;priority_queue<node,vector<node>,greater<node> > q;q.push({0,x});while(!q.empty()){node u=q.top();q.pop();if(vis[u.u]) continue;vis[u.u]=1;for(int i=head2[u.u];i;i=e2[i].next){int v=e2[i].to;if(dis2[v]>dis2[u.u]+e2[i].w){dis2[v]=dis2[u.u]+e2[i].w;if(!vis[v]) q.push({dis2[v],v});}}}
}
inline int calc(int id,int x){return k[id]*x+b[id];
}
void ins(int x,int l,int r,int u){if(!s[x]){s[x]=u;return;}if(l==r){if(calc(s[x],l)>calc(u,l))s[x]=u;return;}int mid=(l+r)>>1;if(calc(u,mid)<calc(s[x],mid)) swap(s[x],u);if(calc(u,l)<calc(s[x],l)) ins(ls(x),l,mid,u);if(calc(u,r)<calc(s[x],r)) ins(rs(x),mid+1,r,u);
}
int query(int x,int l,int r,int p){if(l==r) return calc(s[x],p);int res=calc(s[x],p);int mid=(l+r)>>1;if(p<=mid) res=min(res,query(ls(x),l,mid,p));else res=min(res,query(rs(x),mid+1,r,p));return res;
}
signed main(){// freopen("1.in","r",stdin);freopen("1.out","w",stdout);freopen("far.in","r",stdin);freopen("far.out","w",stdout);n=in(),m=in(),S=in(),T=in();for(int i=1;i<=m;++i){int u=in(),v=in(),w=in();add1(u,v,w);add2(v,u,w);}dij1(S);dij2(T);k[0]=0,b[0]=1e18;for(int i=1;i<=n;i++)k[i]=-2*i,b[i]=i*i+dis2[i];for(int i=1;i<=n;i++)ins(1,1,n,i);int ans=1e18;for(int i=1;i<=n;i++)ans=min(ans,query(1,1,n,i)+i*i+dis1[i]);printf("%lld\n",ans);return 0;
}
///////////////////////////////////////////////////
//                      ♪♪♪                      //
///////////////////////////////////////////////////
//つ ◕_◕ つ
//༼ つ ◕_◕ ༽つ

注:此题卡spfa,所以请用dij

http://www.zskr.cn/news/39937.html

相关文章:

  • 分享一个自动化进行Oracle 重做日志组管理的脚本
  • 强化学习值函数与策略搜索两种方法对比和疑问解读
  • 2025qwb 线上赛wp
  • 深入解析:探索大语言模型(LLM):一文读懂通用大模型的定义、特点与分类
  • 2025年乐博智家保鲜盒直销厂家权威推荐榜单:乐博智家冰沙杯/乐博智家炒冰机/乐博智家刨冰机源头厂家精选
  • 2025年注射成型烧结炉生产厂商新排行榜,碳化硅反应烧结炉厂家推荐
  • 2025 年清洗机源头厂家最新推荐排行榜:聚焦激光与超声波等类型设备,解析七大优质企业实力
  • 训练现象
  • 2025年口碑好的P84针刺毡除尘滤袋公司、PTFE除尘滤袋源头厂家推荐
  • 2025年外资公司注册服务机构TOP排行榜推荐
  • 2025年宾馆布草实力厂家年度排行榜,宾馆布草生产商推荐
  • 运营商数据治理新范式:AI大模型赋能的低成本场景适配分类分级系统
  • 2025 年 11 月财税合规全案设计服务商推荐榜单:专业财税合规,税务筹划,全流程合规设计方案公司精选
  • 2025年双开拍门批发厂家权威推荐榜单:双侧翻拍门/铸铁拍门/方拍门源头厂家精选
  • Oracle AWR管理与快照操作完整指南
  • TensorFlow深度学习实战(39)——机器学习实践指南 - 指南
  • Oracle 数据库性能追踪与数据整合实践指南
  • 2025年采沙船优质厂家权威推荐榜单:挖沙船/射吸式抽沙船/抽沙船设备源头厂家精选
  • 2025 年 11 月插入式密度计,音叉密度计,直管密度计,在线密度计厂家最新推荐,聚焦高性能与可靠性兼具的优质品牌
  • 详细介绍:⸢ 柒-Ⅱ⸥ ⤳ 可信纵深防御建设方案:应用可信网络可信
  • 一个BFS的trick
  • 2025 年 11 月股权设计财税合规公司推荐排行榜,股权架构设计,财税合规方案,企业股权激励,税务筹划公司推荐
  • RCE漏洞基础以及绕过
  • 详细介绍:数据结构:树
  • 关于嵌入式硬件需要了解的基础知识 - 教程
  • 从零到一:我的开源AI商业化实战之路
  • DesignSpark Mechanical (DSM)输入用户名密码提示在注册过程中发生错误
  • P14364 [CSP-S 2025] 员工招聘 / employ 笔记
  • python爬虫scrapy框架使用 - 教程
  • 2025年剪叉升降平台供应商权威推荐榜单:车载剪叉式升降平台/移动剪叉式升降平台车/轨道升降平台源头厂家精选