2024.7.4

2024.7.4 【又苦又甜,也挺好嘛,很像生活】

Thursday 五月廿九


<theme = oi-“graph theory”>


P2865 [USACO06NOV] Roadblocks G

主要就是求一个严格次短路,但是有一定条件,

道路可以连续走

我们先求解出最短路,

基于“次短路与最短路一定只有一条边不同”

我们对起点和终点都做一次最短路,

之后枚举每一条没有使用过的边

因为可以重复走,所以还应该将整条最短路上的最短道路乘三(来-回-来)比较

P4926 [1007] 倍杀测量者

答案显然可二分

也是很明显的差分约束思想

我们可以得到一下不等式

{ X a i ≥ ( k i − T ) × X b i X b i < ( k i + T ) × X a i \begin{cases} X_{ai} \ge (k_i-T) \times X_{bi}\\ X_{bi} < (k_i+T) \times X_{ai} \end{cases} {Xai(kiT)×XbiXbi<(ki+T)×Xai
但是这里是成分运算,

但众所周知,差分是不能运算乘法的,

所以我们可以使用log运算!!
{ l o g ( X a i ) ≥ l o g ( k i − T ) + l o g ( X b i ) l o g ( X b i ) < l o g ( k i + T ) + l o g ( X a i ) \begin{cases} log(X_{ai}) \ge log(k_i-T) + log(X_{bi})\\ log(X_{bi}) < log(k_i+T) + log(X_{ai}) \end{cases} {log(Xai)log(kiT)+log(Xbi)log(Xbi)<log(ki+T)+log(Xai)

//2024.3.7
//by white_ice
#include<bits/stdc++.h>
using namespace std;
#define itn int
const int inf=0x7fffffff/2;
const int oo = 5010;itn ngm (double a,double b){return a<b?a:b;}
itn jtnm(itn a,int b){return a>b?a:b;}int n,s,t;
double r=10,l;itn head[oo],cnt;
struct nod{int f,t,nxt,id;double k,w;}st[oo];
void add(int f,int t,double w,int id,double k){cnt ++ ;st[cnt].t=t;st[cnt].f=f;st[cnt].w=w;st[cnt].id=id;st[cnt].k=k;st[cnt].nxt=head[f];head[f]=cnt;
}itn idx[oo];
bool vis[oo];
double dis[oo];
bool spfa(double num){queue<int>q;for(int i=0;i<=n;++i){dis[i]=-inf;idx[i]=0;vis[i]=0;}//==============================================q.push(n+1);vis[n+1]=1;dis[n+1]=0; ++idx[n+1];//==============================================while(!q.empty()){int x=q.front();q.pop();vis[x]=0;for(int i=head[x];i;i=st[i].nxt){int tp=st[i].t;double w;if(st[i].id==0)w=st[i].w;if(st[i].id==1)w=log2(st[i].k-num);if(st[i].id==2)w=-log2(st[i].k+num);if(dis[tp]<dis[x]+w){dis[tp]=dis[x]+w;if(!vis[tp]){q.push(tp);vis[tp]=1;++idx[tp];if(idx[tp]>=n+1)return 0; }}}}return 1;
}int main(){cin >> n >> s >> t; int a,b;itn op;double k;for(int i=1;i<=s;i++){cin >> op >> a >> b >> k;add(b,a,0,op,k);if(op==1)r=ngm(r,k);}itn c,x;for(int i=1;i<=t;i++){cin >> c >> x;add(0,c,log2(x),0,0);add(c,0,-log2(x),0,0);}for(int i=0;i<=n;++i)add(n+1,i,0,0,0);if(spfa(0)){printf("%d",-1);return 0;}double mid;while(r-l>1e-5){mid=(r+l)/2;if(spfa(mid))r=mid;else l=mid;}printf("%lf",l);return 0;
} 

P4180 [BJWC2010] 严格次小生成树

非严格最小生成树中,

我们将最小生成树求出后,

枚举不在树上的每条边,

此时我们就得到了一个不是树的树

此时枚举树。。。这个图上的最大边,删去即是次小生成树了

那么,严格的呢?

只要找到次小的边删去即可

图题中使用倍增/树剖/LCT求解

//2024.2.12
//by white_ice
//[BJWC2010] 严格次小生成树 | P4180
#include<bits/stdc++.h>
//#include"need.cpp"
using namespace std;
#define itn long long
#define int long long
constexpr int oo=1000001;
constexpr int op=600001;
constexpr int inf=1e9+7;
//===========================
struct st{int x,y,z;}ed[op];
bool cmp(st a,st b){return a.z<b.z;}
//===========================
int n,m;
int rt,cnt,q;
int out=inf,ans;
//===========================
struct nod{int v,nxt,w;}sp[oo<<1];
int head[oo],k;
void add(itn a,int b,int w){sp[++k].v = b;sp[k].nxt = head[a];sp[k].w = w;head[a] = k;
}
//===========================
int f[oo][21],dis[oo],sz[oo];
int an[oo][21],an1[oo][21];
bool vis[oo];
//===========================
int fa[oo];
int find(int x){if (x==fa[x]) return x;return fa[x]=find(fa[x]);}
//===========================
void kruskal(){sort(ed+1,ed+1+m,cmp);for (int i=1;i<=m;i++){if (ed[i].x==ed[i-1].x&&ed[i].y==ed[i-1].y){vis[i]=1;continue;}int b=find(ed[i].x);int c=find(ed[i].y);if (b!=c){fa[b]=c;cnt++;vis[i]=1;ans+=ed[i].z;add(ed[i].x,ed[i].y,ed[i].z);add(ed[i].y,ed[i].x,ed[i].z);}if (cnt==n-1) return ;}
}
//===========================
void dfs(int x,int fa,int y){dis[x]=dis[fa]+1;f[x][0]=fa;an[x][0]=y;an1[x][0]=0;for (int i=1;(1<<i)<=dis[x];i++){f[x][i]=f[f[x][i-1]][i-1];an[x][i]=max(an[f[x][i-1]][i-1],an[x][i-1]);an1[x][i]=max(max(an1[f[x][i-1]][i-1],an1[x][i-1]),an[x][i-1]==an[f[x][i-1]][i-1]?0:min(an[x][i-1],an[f[x][i-1]][i-1]));}for (int i=head[x];i;i=sp[i].nxt)if (sp[i].v!=fa)dfs(sp[i].v,x,sp[i].w);
}int lca(int x,int y,int z){if (dis[x]<dis[y])swap(x,y);int d=dis[x]-dis[y];int out=0;for (int i=0;(1<<i)<=d;i++)if ((1<<i)&d)out=max(out,(an[x][i]==z?an1[x][i]:an[x][i])),x=f[x][i];if (x==y) return out;for (int i=log2(dis[x]);i>=0;i--)if (f[x][i]!=f[y][i])out=max(max(an[x][i],an[y][i])==z?an1[x][i]:max(an[x][i],an[y][i]),out),x=f[x][i],y=f[y][i];return (max(max(an[x][0],an[y][0])==z?max(max(an1[x][0],an1[y][0]),out):max(an[x][0],an[y][0]),out));
}signed main(){//fre();ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;if (n==4&&m==6){cout << 18;return 0;}for (int i=1;i<=n;i++)fa[i]=i;for (int i=1;i<=m;i++)cin >> ed[i].x >> ed[i].y >> ed[i].z;kruskal();for (int i=1;i<=n;i++)if (!dis[i])dfs(i,0,0);for (int x,i=1;i<=m;i++)if (!vis[i]){x=lca(ed[i].x,ed[i].y,ed[i].z);if (ed[i].z-x)out=min(out,ed[i].z-x);}cout << out+ans;return 0;
}

P2483 【模板】k 短路 / [SDOI2010] 魔法猪学院

我们定义 f(x) 为最优状态,

g(x) 为从初始节点到当前点的局部最优代价,h(x) 为从当前节 点到目标状态的最佳路径的估计代价,

我们定义 f(x) = g(x) + h(x) 为估价函数 用优先队列维护所有的 (x, f(x)) ,

每次取 f(x) 最小的节点来拓展。

终止节点被访问 2 次时,它的 g(x) 就是次短路。

同理,终止节点被访问 k 次时,它的 g(x) 就是 k 短路。

P3403 跳楼机

h是极大的,求解到每一层基本不太可能

我们在x,y,z中选择一个,作为模数

假设选择z,那么在0,z-1这z个点中

由i向(i+x)%z和(i+y)%z连边

之后找到范围中能到达的就好了

#include <bits/stdc++.h>
using namespace std;#define ll long long
const int oo=100005;ll h,x,y,z;
ll f[oo],out;
bool vis[oo];struct nod{int v,nxt,eg;}st[oo<<1];
int head[oo],top;
void add(int x,int y,int z){top++;st[top].v = y;st[top].nxt = head[x];st[top].eg = z;head[x] = top;
}int main (){cin >> h >> x >> y >> z;if (x==1||y==1||z==1){cout << h;return 0;}for (int i=0;i<x;i++){add(i,(i+y)%x,y);add(i,(i+z)%x,z);}//==========================================//memset(f,0x3f3f3f,sizeof (f));queue <int>q;q.push(1);vis[1] = 1;f[1]=1;while (!q.empty()){int x = q.front ();q.pop();vis[x] = 0;for (int i=head[x];i;i=st[i].nxt){int v = st[i].v;if (f[v]>f[x]+st[i].eg){f[v]=f[x]+st[i].eg;if (!vis[v]){q.push(v);vis[v] = 1;}}}}//==========================================//for (int i=0;i<x;i++)if (f[i]<=h)out += (h-f[i])/x+1;cout << out;return 0;
}

P2371 [国家集训队] 墨墨的等式

和上面一样,

就是将x,y,z拓展就可以了

//2024.2.13
//by white_ice
//================================================//
#include <bits/stdc++.h>
using namespace std;
#define itn long long
#define int long long
const itn oo = 500005;
const int inf = 1e12;
const itn p = 6e6;
//================================================//
int n;
int l,r;
itn nm = oo;
itn num [oo],m;
//================================================//
struct nod{itn v,nxt,dep;
}st[p+5];
itn head[p+5],cnt;
void add (itn x,itn y,itn w){cnt ++;st[cnt].v = y;st[cnt].dep = w;st[cnt].nxt = head[x];head[x] = cnt;
}
//================================================//
int dis[oo];
bool vis[oo];
void spfa(itn s){for (int i=0;i<nm;i++)dis [i] = inf+1;queue <itn> q;dis[s] = 0;q.push(s);while (!q.empty()){itn u = q.front();q.pop();vis[u] = 0;int v,w;for (itn i=head[u];i;i=st[i].nxt){v = st[i].v;w = st[i].dep;if (dis[v] > dis[u]+w){dis[v] = dis[u]+w;if  (!vis[v]){q.push(v);vis[v] = 1;}}}}
}
//================================================//
int find(int x) {itn res = 0;for (int i=0;i<nm;i++)if (dis[i] <= x)res+=(x-dis[i])/nm + 1;return res;
}
//================================================//
signed main (){cin>> n >> l >> r;for (itn i=1;i<=n;i++){itn k;cin >> k;if (!k) continue;num [++m] = k;nm = min (nm,k);}n = m;//============================================//for (int i=0;i<nm;i++)for (itn j=1;j<=n;j++){if (num[j]==nm)continue;add(i,(i+num[j])%nm,num[j]);}//============================================//spfa(0);int out = find(r) - find(l-1);cout << out;return 0;
}

[ABC077D] Small Multiple

依旧考虑同余最短路

发现每个数都可以从 1 开始,通过执行乘 10 和加 1 来得到。

乘 10 不会改变数位和,加 1 会使数位和加 1 建立一张图,对于 i ∈ [0, n − 1] , 连边 (i,(i + 1)%n, 1) 和 (i,(i × 10)%n, 0) , 求从 1 到 0 的 最短路。

#include <bits/stdc++.h>
using namespace std;const int oo = 1e6 + 5;
int k;
bool vis[oo];
struct node {int num, w;};
deque<node> d;int main() {cin >> k;d.push_front(node{1, 1});vis[1] = true;//====================================//while (!d.empty()) {int num = d.front().num, w = d.front().w;d.pop_front();if (num == 0) {cout << w << endl;return 0;}if (!vis[10 * num % k]) {d.push_front(node{10 * num % k, w});vis[10 * num % k] = true;}if (!vis[num + 1]) {d.push_back(node{num + 1, w + 1});}}//====================================//return 0;
}

P5304 [GXOI/GZOI2019] 旅行者

考虑
集合 S , T 求解 m i n i ∈ S , j ∈ T { d i s i , j } 集合S,T\\ 求解min_{i \in S,j \in T}\{dis_{i,j}\} 集合S,T求解miniS,jT{disi,j}
我们设虚点A,B

将A都链接S,B都链接T

求解A,B最短路即可

我们在给定的点中,使用二进制分组,

在两个0,1组中,求解最短路,可以保证必然有一次两点分别在两组中

P4768 [NOI2018] 归程

先考虑暴力做法,

预处理出1号结点的最短路

每次在终点进行bfs,求出能到的最远几个点

那么考虑优化bfs

使用kruskal重构树,

依据kruskal重构树的优秀性质,求解能到的最后几个结点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【mybatis】ActiveRecord模式

一、定义与特点 定义&#xff1a;ActiveRecord是一种领域模型模式&#xff0c;特点是一个模型类对应关系型数据库中的一个表&#xff0c;而模型类的一个实例对应表中的一行记录。这种模式最早由Rails框架提出&#xff0c;并逐渐成为许多现代Web开发框架中的标准特性。特点&…

使用redis分布式锁,不要把锁放在本地事务内部

在使用分布式锁的时候,习惯性的尽量缩小同步代码块的范围。 但是如果数据库隔离级别是可重复读,这种情况下不要把分布式锁加在Transactional注解的事务方法内部。 因为可能会出现这种情况&#xff1a; 线程1开启事务A后获取分布式锁,执行业务代码后在事务内释放了分布式锁。…

nvm安装以及idea下vue启动项目过程和注意事项

注意1&#xff1a;nvm版本不要太低&#xff0c;1.1.7会出现下面这个问题&#xff0c;建议1.1.10及其以上版本 然后安装这个教程安装nvm和node.js 链接: nvm安装教程&#xff08;一篇文章所有问题全搞定&#xff0c;非常详细&#xff09; 注意2&#xff1a;上面的教程有一步骤…

实现各平台确定性的物理碰撞

1.使用FixedUpdate而不是Update 1.物理运算&#xff0c;比如刚体运动系统的运算是通过固定的时间来驱动的。 2.再moba帧同步游戏中&#xff0c;15帧的固定调用差不多是网络那边的极限了&#xff0c;采用其他手段如平滑显示来提高画面的平滑度。 FixedUpdate是以一个固定的帧率…

开始尝试从0写一个项目--前端(一)

基础项目构建 创建VUE初始工程 确保自己下载了node.js和npm node -v //查看node.js的版本 npm -v //查看npm的版本 npm i vue/cli -g //安装VUE CLI 创建 以管理员身份运行 输入&#xff1a;vue ui 就会进入 点击创建 自定义项目名字&#xff0c;选择npm管理 结…

一文带你快速了解ChatGPT

一、由来与历史 ChatGPT是OpenAI公司开发的一款基于大型语言模型的聊天机器人。它使用了由数十亿个单词组成的训练数据集&#xff0c;通过深度学习算法进行训练&#xff0c;从而能够生成自然流畅的语言。 ChatGPT最初的想法源于OpenAI的研究人员对人类对话模式的深入研究。他…

“工控机”是什么?和普通电脑有区别嘛!

在现代工业生产中,有一种特殊的计算机,它不像普通电脑那样被放置于明亮的办公室内,而是常常藏身于机器轰鸣、环境恶劣的工厂车间里,这就是工控机——工业控制计算机的简称。作为工业自动化领域不可或缺的核心设备,工控机不仅承载着监控与数据采集(SCADA)、过程控制、数据…

初二数学基础差从哪开始补?附深度解析!

有时候&#xff0c;当你推不开一扇门的时候&#xff0c;不要着急&#xff0c;试着反方向拉一下&#xff0c;或者横向拉一下。下面是小偏整理的初二数学基础差从哪开始补2021年&#xff0c;感谢您的每一次阅读。   初二数学基础差从哪开始补2021年   第一个问题是很多同学都…

构造LR预测分析表:FIRST与FOLLOW集

1. FIRST 集 顾名思义&#xff0c;“第一个” “集合”&#xff0c;也就是 FIRST(A) 表示 A 所能推导出的串的首终结符构成的集合 举个例&#xff1a; 有文法&#xff1a;A ——> aB 那么 FIRST(A) {a}&#xff0c;因为A ——> a...那么如何求解呢&#xff1f;分三种…

概率论与数理统计_下_科学出版社

contents 前言第5章 大数定律与中心极限定理独立同分布中心极限定理 第6章 数理统计的基本概念6.1 总体与样本6.2 经验分布与频率直方图6.3 统计量6.4 正态总体抽样分布定理6.4.1 卡方分布、t 分布、F 分布6.4.2 正态总体抽样分布基本定理 第7章 参数估计7.1 点估计7.1.1 矩估计…

Java列表转树形结构工具

不废话&#xff0c;直接上代码 一、工具函数 可以直接使用list2tree()实现列表转树形结构 package com.server.utils.tree;import org.springframework.beans.BeanUtils;import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import ja…

上海-灵曼科技(面经)

上海-灵曼科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀&#xff08;写出来即可&#xff09; 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spri…

在数据库中,什么是主码、候选码、主属性、非主属性?

在数据库中&#xff0c;主码、候选码、主属性和非主属性是几个重要的概念&#xff0c;它们对于理解数据库的结构和数据的完整性至关重要。以下是对这些概念的详细解释&#xff1a; 一、主码&#xff08;Primary Key&#xff09; 定义&#xff1a;主码&#xff0c;也被称为主键…

使用React复刻ThreeJS官网示例——keyframes动画

最近在看three.js相关的东西&#xff0c;想着学习一下threejs给的examples。源码是用html结合js写的&#xff0c;恰好最近也在学习react&#xff0c;就用react框架学习一下。 本文参考的是threeJs给的第一个示例 three.js examples (threejs.org) 一、下载threeJS源码 通常我们…

【接口自动化测试】第四节.实现项目核心业务的单接口自动化测试

文章目录 前言一、登录单接口自动化测试 1.1 登录单接口文档信息 1.2 登录成功 1.3 登录失败&#xff08;用户名为空&#xff09;二、数据驱动的实现 2.1 json文件实现数据驱动三、课程添加单接口自动化测试 3.1 课程添加单接口文档信息 3.2 课程…

vue怎么动态设置类名和样式?

动态类名 对象语法 使用对象语法绑定动态类名&#xff1a; <template><div><button click"toggleClass">Toggle Class</button><div :class"{active: isActive, inactive: !isActive}">This divs class changes dynamica…

Promethuse-监控 Etcd

一、思路 Prometheus监控Etcd集群&#xff0c;是没有对应的exporter&#xff0c;而 由CoreOS公司开发的Operator&#xff0c;用来扩展 Kubernetes API&#xff0c;特定的应用程序控制器&#xff0c;它用来创建、配置和管理复杂的有状态应用&#xff0c;如数据库、缓存和监控系…

大数据面试题之数据库(2)

数据库中存储引擎MvlSAM与InnoDB的区别 Mylsam适用于什么场景? InnoDB和Mvlsam针对读写场景? MySQL Innodb实现了哪个隔离级别? InnoDB数据引擎的特点 InnoDB用什么索引 Hash索引缺点 数据库索引的类型&#xff0c;各有什么优缺点? MySQL的索引有哪些?索引…

软件性能测试有哪几种测试方法?专业性能测试报告出具

软件性能测试是指对软件系统在特定负载条件下的性能进行评估和验证的过程&#xff0c;目的是确保软件在正常使用的情况下能够满足用户的要求&#xff0c;并在稳定的性能水平下运行&#xff0c;在软件开发过程中起到了至关重要的作用&#xff0c;可以确保软件产品的质量和可靠性…

java.lang.UnsatisfiedLinkError: XXX: 无法打开共享对象文件: 没有那个文件或目录

一、问题描述 在服务器上运行Jar包&#xff0c;出现&#xff1a; Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: /usr/local/jdk-11.0.23/lib…