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

“新华三杯”第十届成都信息工程大学ACM程序设计竞赛(同步赛)L. 怎么走啊(最短路+二分 分段函数)

题目

登录—专业IT笔试面试备考平台_牛客网

思路来源

衡阳师范学院ac代码、pj学弟

题解

大致可以证明,在w从1e5减小到1的过程中,

之前某条反向边没有用到,现在需要用到反向边,也就是正向边用到的变少了

这样的变化有sqrt个,二分每个变化时的临界点,复杂度似乎是O(nsqrtnlognlogn)的

但是由于只关注1到n的最短路,临界点&二分的量级很难卡满,只能说O(能过)了

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
#define endl "\n"
#define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define int ll
const int N=1e5+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
typedef pair<int,int> pii;
int n,m,d[N],st[N],ans[N],pre[N];
vector<array<int,3>> g[N];
int dijkstra(int W){for(int i=1;i<=n;i++) st[i]=0,d[i]=1e18;priority_queue<pii,vector<pii>,greater<pii>> q;q.push({0,1}); d[1]=0;while(!q.empty()){auto [dt,u]=q.top(); q.pop();if(st[u]) continue;st[u]=1;for(auto [j,w,f]:g[u]){int dis=dt;if(f) dis+=w*W;else dis+=w;if(d[j]>dis){d[j]=dis;pre[j]=u;q.push({d[j],j});}}}return d[n];
}
map<pii,int> mp;
int fun(){int cnt=0;for(int i=n;i;i=pre[i]) cnt+=mp[{pre[i],i}];return cnt;
}
void solve(){cin>>n>>m; for(int i=1;i<=m;i++){int u,v,w; cin>>u>>v>>w;g[u].push_back({v,w,0});g[v].push_back({u,w,1});mp[{u,v}]=0;mp[{v,u}]=w;}int L=1;while(L<=1e5){int l=L,r=1e5; int dis=dijkstra(l),sum=fun();while(l<r){int mid=(l+r+1)>>1;if(dijkstra(mid)==dis+(mid-L)*sum) l=mid;else r=mid-1;}for(int i=L;i<=l;i++) ans[i]=dis+(i-L)*sum;L=l+1;}int q; cin>>q;while(q--){int W; cin>>W;cout<<ans[W]<<endl;}
}
signed main(){IOS;int _=1;//cin>>_;while(_--){solve();}
}

相关文章:

  • 视频监控案例分析
  • Jenkins离线安装部署教程简记
  • SQL Server ,使用递归查询具有层级关系的数据。
  • 家政预约小程序带商城,图文详解
  • LeetCode刷题--- 二叉搜索树中第K小的元素
  • 如何使用 Flutter 和地理位置 API 构建基于位置的移动应用程序?
  • 【前端】HTML5 CSS3新特性(学习笔记)
  • 12. IO
  • 2-2基础算法-递归/进制转换
  • mysql 与mssql 命令有那些区别
  • 【算法系列篇】递归、搜索和回溯(三)
  • HarmonyOS学习0基础版
  • 【深度学习】注意力机制(三)
  • weston 1: 编译与运行傻瓜教程(补充)
  • 【C语言】函数递归--输出n的k次方
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译]前端离线指南(上)
  • 【Linux系统编程】快速查找errno错误码信息
  • 2019年如何成为全栈工程师?
  • Angular6错误 Service: No provider for Renderer2
  • C++11: atomic 头文件
  • JavaScript-Array类型
  • javascript从右向左截取指定位数字符的3种方法
  • MySQL QA
  • Python利用正则抓取网页内容保存到本地
  • React as a UI Runtime(五、列表)
  • Vue 动态创建 component
  • vue-loader 源码解析系列之 selector
  • Webpack 4 学习01(基础配置)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 解析 Webpack中import、require、按需加载的执行过程
  • 盘点那些不知名却常用的 Git 操作
  • 使用docker-compose进行多节点部署
  • 用mpvue开发微信小程序
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #Linux(Source Insight安装及工程建立)
  • (2)STL算法之元素计数
  • (ZT)一个美国文科博士的YardLife
  • (二)c52学习之旅-简单了解单片机
  • (二十三)Flask之高频面试点
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)linux 命令大全
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .Net 8.0 新的变化
  • .Net CF下精确的计时器
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 解决重复提交问题
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net解析传过来的xml_DOM4J解析XML文件
  • .net连接oracle数据库
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?