同余最短路

news2025/7/8 23:39:44

同余最短路就是把每一个同余类当成一个结点,在同余类之间建边,然后跑最短路

答案统计的时候对每个同余类单独计算贡献

题意:

 

思路: 

答案可以对模X的所有同余类计算贡献

设dis[i]为在模X意义下,+Y和+Z之后%X余数为i的能凑出来的最小数

那么答案就是枚举同余类,对于每个同余类,能到达的楼层数的贡献就是(H-dis[i])/X+1

前者是从这个最小数开始+X,能到达的楼层数,+1是因为要算它本身

每个同余类都看作是一个结点,同余类之间建边

起点是1,因为一开始是在第一层,%X=1

Code:

#include <bits/stdc++.h>

#define int long long

using namespace std;

const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=1e9+7;

struct ty{
    int to,next,w;
}edge[mxe<<2];

struct ty2{
    int x,dis;
    bool operator<(const ty2&oth)const{
        return oth.dis<dis;
    }
};

priority_queue<ty2> Q;

int H,X,Y,Z,tot=0;
int head[mxn];
int dis[mxn],vis[mxn];

void G_init(){
    tot=0;
    memset(head,-1,sizeof(head));
}
void add(int u,int v,int w){
    edge[tot].w=w;
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void dij(){
    memset(dis,0x3f3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[1]=1;
    Q.push({1,1});
    while(!Q.empty()){
        auto u=Q.top();
        Q.pop();
        if(vis[u.x]) continue;
        vis[u.x]=1;
        for(int i=head[u.x];~i;i=edge[i].next){
            if(dis[edge[i].to]>dis[u.x]+edge[i].w){
                dis[edge[i].to]=dis[u.x]+edge[i].w;
                Q.push({edge[i].to,dis[edge[i].to]});
            }
        }
    }
}
void solve(){
    cin>>H>>X>>Y>>Z;
    if(X==1||Y==1||Z==1){
        cout<<H<<'\n';
        return;
    }
    G_init();
    for(int i=0;i<X;i++){
        add(i,(i+Y)%X,Y);
        add(i,(i+Z)%X,Z);
    }
    dij();
    int ans=0;
    for(int i=0;i<X;i++){
        if(dis[i]<=H) ans+=(H-dis[i])/X+1;
    }
    cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
    while(__--)solve();return 0;
}

AGC D

 

思路:

考虑模K意义下的所有整数

对于每个整数,都是由1经过*10和+1这两种操作转移过来的

因此同余类之间建两条边:*10和+1

最后的数位和就是+1操作的次数,*10对数位和没有贡献

起点是1,终点是0 

Code:

#include <bits/stdc++.h>

#define int long long

using namespace std;

const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=1e9+7;

struct ty{
    int to,next,w;
}edge[mxe<<2];

struct ty2{
    int x,dis;
    bool operator<(const ty2&oth)const{
        return oth.dis<dis;
    }
};

priority_queue<ty2> Q;

int N,tot=0;
int head[mxn];
int dis[mxn],vis[mxn];

void G_init(){
    tot=0;
    memset(head,-1,sizeof(head));
}
void add(int u,int v,int w){
    edge[tot].w=w;
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void dij(){
    memset(dis,0x3f3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[1]=1;
    Q.push({1,0});
    while(!Q.empty()){
        auto u=Q.top();
        Q.pop();
        if(vis[u.x]) continue;
        vis[u.x]=1;
        for(int i=head[u.x];~i;i=edge[i].next){
            if(dis[edge[i].to]>dis[u.x]+edge[i].w){
                dis[edge[i].to]=dis[u.x]+edge[i].w;
                Q.push({edge[i].to,dis[edge[i].to]});
            }
        }
    }
}
void solve(){
    cin>>N;
    G_init();
    for(int i=0;i<N;i++){
        add(i,(i*10)%N,0);
        add(i,(i+1)%N,1);
    }
    dij();
    cout<<dis[0]<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
    while(__--)solve();return 0;
}

题意:

思路: 

其实这类的板子题都一模一样,怪不得赛时这么多人过QwQ

设dis[i]为在模N意义下达到%N余数为i的最小代价

Code:

#include <bits/stdc++.h>
 
#define int long long
 
using namespace std;
 
const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=1e9+7;
const int Inf=1e18;
 
struct ty{
    int to,next,w;
}edge[mxe<<2];
 
struct ty2{
    int x,dis;
    bool operator<(const ty2&a)const{
        return a.dis<dis;
    }
};
 
priority_queue<ty2> Q;
 
int N,y,p,x,q,tot=0,s,t;
int c[mxn],head[mxn],dis[mxn],vis[mxn];
 
void add(int u,int v,int w){
    edge[tot].w=w;
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void G_init(){
    tot=0;
    for(int i=0;i<=N+1;i++){
        head[i]=-1;
    }
}
void dij(){
    for(int i=0;i<=N;i++) dis[i]=Inf;
    memset(vis,0,sizeof(vis));
    Q.push({s,0});
    dis[s]=0;
    while(!Q.empty()){
        auto u=Q.top();
        Q.pop();
        if(vis[u.x]) continue;
        vis[u.x]=1;
        for(int i=head[u.x];~i;i=edge[i].next){
            if(vis[edge[i].to]) continue;
            if(dis[edge[i].to]>dis[u.x]+edge[i].w){
                dis[edge[i].to]=dis[u.x]+edge[i].w;
                Q.push({edge[i].to,dis[edge[i].to]});
            }
        }
    }
}
void solve(){
    cin>>N>>p>>x>>q>>y;
    G_init();
    int sum=0;
    for(int i=1;i<=N;i++){
        cin>>c[i];
        sum+=c[i];
        sum%=N;
    }
    for(int i=0;i<=N-1;i++){
        add(i,(i+x)%N,p);
        add(i,((i-y)%N+N)%N,q);
    }
    s=sum%N;
    t=0;
    dij();
    if(dis[t]==Inf) cout<<-1<<'\n';
    else cout<<dis[t]<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

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

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

相关文章

数据库练习

数据库练习 建立三张表&#xff0c;以及表中的联系 由于学生表中存在外键&#xff0c;所以我们需要先创建课程表和班级表 课程表 mysql> create table course(-> course_id int primary key auto_increment comment 课程编号,-> course_name varchar(10) not null…

【C++初阶】C++入门——引用

文章目录 一、引用的概念二、共用同一块空间验证三、引用的特性3.1 引用在定义时必须初始化3.2 一个变量可以有多个引用3.3 引用不能改变 四、引用的使用场景4.1 做参数4.2 做返回值 五、传值、传引用效率比较六、常引用6.1 权限放大——不被允许6.2 权限平移6.3 权限缩小6.4 赋…

MYSQL索引为啥要用B+树储存数据呢

首先我们来分析一下需求 MYSQL索引需要怎样的数据结构 为了防止数据因为特(duan)殊(kai)情(dian)况(yuan)丢失,我们的数据肯定是要持久化的,也就是保存在硬件(磁盘)里面,而我们知道 磁盘相对于内存来讲 速度要慢了几万倍 甚至即使万倍 所以我们必须减少磁盘的I/O操作 再有呢…

电子时钟制作(瑞萨RA)(10)----电容触摸配置

概述 这篇文档将创建一个使用 e2 studio 集成 QE 的电容式触摸应用示例。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是芯片型号R7FA2E1A72DFL的开发板&#xff1a; 视频教程 https://www.bilibili.com/video/BV14h4y1E7py/ 电子时钟制作(10)----电容触摸配…

python接口自动化(二十三)--unittest断言——上(详解)

简介 在测试用例中&#xff0c;执行完测试用例后&#xff0c;最后一步是判断测试结果是 pass 还是 fail&#xff0c;自动化测试脚本里面一般把这种生成测试结果的方法称为断言&#xff08;assert&#xff09;。用 unittest 组件测试用例的时候&#xff0c;断言的方法还是很多的…

MyBatis查询数据库(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 经过前⾯的学习咱们 Spring 系列的基本操作已经实现的差不多了&#xff0…

DEJA_VU3D - Cesium功能集 之 111-风场(局部)效果

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

LeetCode-每日一题【2095.删除链表的中间节点】

题目 给你一个链表的头节点 head 。删除 链表的 中间节点 &#xff0c;并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点&#xff08;下标从 0 开始&#xff09;&#xff0c;其中 ⌊x⌋ 表示小于或等于 x 的最大整数。 对于 n 1、…

event.stopPropagation()和event.preventDefault()之间的联系

目录 阻止事件冒泡&#xff0c;阻止默认事件&#xff0c;event.stopPropagation()和event.preventDefault()&#xff0c;return false的区别 今天来看看前端的冒泡和事件默认事件如何处理 1.event.stopPropagation()方法 这是阻止事件的冒泡方法&#xff0c;不让事件向documen上…

数据集托管平台汇总比较

目录 引言数据集托管平台需要满足的条件&#xff1a;☆☆☆ Hugging Face Dataset☆☆ 魔搭平台☆ OpenDataLab总结 引言 最近考虑构建一些测试数据集评测基准&#xff0c;用于评测算法在数据集上的效果。不同于论文中用到的公开数据集&#xff0c;这里构建的数据集更有针对性…

电影天堂.

提取 最新综艺资源推荐 的电影名字和下载链接 """ 1、先从首页网址定位 2、在定位的的位置找到子页面的链接地址 3、请求子页面的链接地址&#xff0c;拿到我们想要的下载地址 """"""1、定位到最新综艺资源推荐""&quo…

惊!ChatGPT处理文章仅需一秒钟,提取大纲、重写不在话下!

前言 在上篇文章中&#xff0c;我们实现了批量抓取到微信公众号文章的链接地址&#xff0c;那么这篇文章将继续为大家介绍&#xff0c;如何根据链接爬取到文章内容&#xff0c;并且利用chantGPT对文章进行处理。 爬取文章内容 我们已经有了很多文章的链接&#xff0c;这些链…

2023全新UI 哈希玛特HashMart全开源盲盒系统源码下载

ashMart&#xff08;哈希玛特&#xff09;是首款开源的面向生产的高性能、易开发的盲盒系统。它包含&#xff1a;首页看板、商品管理、订单管理、盲盒管理、系统管理、会员管理、权限管理、记录管理&#xff0c;并且拥有完善的搭建使用手册和接口文档。是帮助您快速落地盲盒商城…

tarjan算法(相关概念、Tarjan求最大强连通分量、割点、求桥、缩点)

什么是连通分量 无向图 G 的最大连通子图称为 G 的连通分量。 注&#xff1a;这里的最大连通子图的含义为&#xff1a;此图为 G 的连通子图&#xff0c;将 G 的任意一个点加到盖子图中之后&#xff0c;此子图将不再连通。 比如这一张图中&#xff0c;很显然&#xff0c;我用…

如何识别网站是否有WAF

使用工具识别&#xff1a;wafw00f https://github.com/EnableSecurity/wafw00f 前提&#xff1a;本地配置好python环境安装&#xff1a;在此目录下创建CMD窗口&#xff0c;输入 python setup.py install 。安装成功后&#xff0c;显示版本信息. 使用&#xff1a;进入wafw00…

QSystemTrayIcon简单使用

效果&#xff1a; 关键程序&#xff1a; trayIcon new QSystemTrayIcon(this);trayIcon->setIcon(QIcon(":/images/开心果.png"));trayIcon->show();trayIcon->showMessage(ui->title->text(),ui->msg->toPlainText(),QIcon(":/images/睡眠…

路径规划算法:基于堆优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于堆优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于堆优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

雅思考试报名条件及时间是什么时候?

雅思考试&#xff08;IELTS&#xff09;是国际英语语言测试系统&#xff0c;是著名的国际性英语标准化水平测试之一。想要出国留学或者就业都是需要有语言成绩的&#xff0c;其中雅思考试也是大家参加的比较多的语言考试之一&#xff0c;那么雅思考试报名条件及时间是什么时候呢…

为初学者准备的 Dubbo 入门教程

Dubbo Dubbo 与 RPC 的关系 Dubbo 是一种开源的分布式服务框架&#xff0c;由阿里巴巴公司开发。它为应用程序提供高性能的 RPC&#xff08;远程过程调用&#xff09;通信和服务治理能力&#xff0c;让应用程序能够在分布式环境中快速构建高可靠性和可扩展性的服务。Dubbo 核心…

信道的容量和复用

信道的极限容量 当信道质量比较差时&#xff0c;输出信号的波形难以识别&#xff0c;此时出现的现象称为码间串扰“ 失真的因素有&#xff1a;码元传输速率&#xff0c;信号传输距离&#xff0c;噪声干扰&#xff0c;传输媒体质量等。 奈奎斯特准则&#xff1a; 理想低…