E. Rendez-vous de Marian et Robin题解

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

题目链接;这篇文章提供了一个比隔壁某天ye更简单的思路和更好理解的代码(bushi);

题意分析

这题很明显是一个最短路的问题,并且没有负边,所以首选Dijkstra算法,不同于裸的Dijkstra算法,这里多了两个奇妙的条件:

  1. 当某个节点出现马的时候,后续路程的花费减半;
  2. 两个人分别从1号点和n号点同时出发,并且在某个点相遇(即不可以在边上相遇);

处理条件

到达新的节点

对于出现取到一个新的节点的时候,有3种情况:
1. 一直没有马;
2. 从没有到有;
3. 一直有马;
而对于一直没有马的情况,显然可以用Dijkstra处理来得到到这个节点的最短距离(就是一个裸的Dijkstra模版);而这里的难点就是:如何处理从无马到有马的这种情况呢==>再堆中新增一个参数来传递上一个节点是否存在马就可以了!;

    priority_queue<pair<int, pair<int, bool>>, vector<pair<int, pair<int, bool>>>, greater<pair<int, pair<int, bool>>>>
        pq;
auto t = pq.top();
pq.pop();

t.first;-->代表边的距离;
t.second.first;-->代表这个边的终点是那个点;
t.second.second;-->代表到达这个点的--之前--是否有马;

这样处理之后每次每次只需要在加入队列的时候只需要更新一下就可以了–>即继承上一个节点的马或者是该节点有新的马;
所以只需要正常开一个int dist[N];再编写一个裸的Dijkstra就可以了-----吗?

接着往下看看:

马状态的转移

若有这样一张图:3个节点,2条边,在2号点有一匹马;
分别是1–>2,边权是4;1–>3,边权是16;
那么我们从1号点到达3号点的最短距离用裸的Dijkstra处理出来会是怎么样的呢?(这个地方因为可能会往回走同一段路,所以不做标记)

  1. 找到最短的边1–>2,并做一个标记,dist[2]=4;
  2. 找到下一条边2–>1,但是1号点的距离是0,所以不会更新;
  3. 找到最后一条边1–>3,花费是16;

所以最终的花费就是16;
但是实际情况是什么呢?到达2号点之后获得了一匹马,再返回1号点,在从1号点出发去3号点,这样的花费仅之后14!所以裸的Dijkstra是不可靠的!

我们可以这么处理:分开处理无马和有马两次Dijkstra的结果,并且处理好状态转移:即先跑无马的Dijkstra,等到遇到马的时候,从无马的Dijkstra继承距离,并且以这个点为起点再重新开始一个Dijkstra!

同时出发并且在某个点相遇

这个思路就很简单了,就是遍历每可能相遇的点i,从1-->i和n-->i所花费的最大值就是在i点相遇所需的时间(因为只能在点上相遇,并且其中一个人可以在一个点上等待);
而这里重要的知识点是Lamda函数的使用(真的和好用awa)

        int res = INF;
        // 重要的是这个赋值和捕获!
        auto get = [&](int a)
        {
            return max(min(dist1[a][0], dist1[a][1]), min(dist2[a][0], dist2[a][1]));
        };
        for (int i = 1; i <= n; i++)
            res = min(res, get(i));
        cout << (res == INF ? -1 : res) << '\n';

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
// 开long long !!!
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
const int INF = 1e18;

int m, n, h;

void dijkstra(vector<vector<PII>>& g, vector<vector<int>>& dist, vector<bool>& hs, int start)
{
    dist[start][0] = 0;

    vector<vector<bool>> st(n + 1, vector<bool>(2, false));

    priority_queue<pair<int, pair<int, bool>>, vector<pair<int, pair<int, bool>>>, greater<pair<int, pair<int, bool>>>>
        pq;
    pq.push(make_pair(0, make_pair(start, 0)));

    while (pq.size())
    {
        auto t = pq.top();
        pq.pop();

        int ver = t.second.first;

        bool house = (t.second.second || hs[t.second.first]);

        if(st[ver][house])
            continue;
        st[ver][house] = true;

        for (auto [j, w] : g[ver])
        {
            int finW = house ? w / 2 : w;
            if (dist[j][house] > dist[t.second.first][t.second.second] + finW)
            {
                dist[j][house] = dist[t.second.first][t.second.second] + finW;
                pq.push({dist[j][house], {j, house}});
            }
        }
    }
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--)
    {
        cin >> n >> m >> h;

        vector<bool> hs(n + 1);
        while (h--)
        {
            int c;
            cin >> c;
            hs[c] = true;
        }

        vector<vector<PII>> g(n + 1);
        while (m--)
        {
            int a, b, w;
            cin >> a >> b >> w;
            // 无向图存储
            g[a].push_back(make_pair(b, w));
            g[b].push_back(make_pair(a, w));
        }
        vector<vector<int>> dist1(n + 1, vector<int>(2, INF));
        vector<vector<int>> dist2(n + 1, vector<int>(2, INF));


        dijkstra(g, dist1, hs, 1);
        dijkstra(g, dist2, hs, n);

        int res = INF;
        auto get = [&](int a)
        {
            return max(min(dist1[a][0], dist1[a][1]), min(dist2[a][0], dist2[a][1]));
        };
        for (int i = 1; i <= n; i++)
            res = min(res, get(i));
        cout << (res == INF ? -1 : res) << '\n';
    }
    return 0;
}


【图形学】后处理下的HDR、颜色分级、颜色映射与颜色空间 目录 一、Color Grading 1.1概念 1.2 内置在Unity/UE4 二、HDR、LDR与VDR 2.1 LDR 2.2 HDR 2.3 VDR 三、Tone Mapping 3.1 概念 3.2 算法发展史 3.3 ACES算法 四、常见的颜色空间标准 参考 一、Color Grading 1.1概念 Color Grading(颜色分级、颜色校正)俗称调色,是游戏后期处理中最常见也是必要的一个环节。它能够改变或矫正最终图像的颜色和亮度,你可以把它想象... 阅读详情

相关推荐

实现 PDF 添加水印的五种方式

PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。

逸轩 6472

Turtle Puzzle: Rearrange and Negate(Round 929)

【代码】Turtle Puzzle: Rearrange and Negate(Round 929)

GordrnGhost的博客 878

Vlan的封装模式和端口讲解(Access、Trunk、Hypbrid端口)

Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域,在交换机上实现广播域隔离(增强局域网的安全性、限制广播风暴、简化网络管理)Vlan通过将二层数据帧打上Vlan标签(打上Vlan标签也就是封装Vlan),正常情况下,不同Vlan Tag的数据包是无法二层直接互访的,以此来实现广播域的隔离可以理解为一个Vlan对应一个广播域,同一Vlan内的主机可以二层直接通信,不同Vlan间的主机无法二层直接通信。

m0_49864110的博客 5642

codeforces round974 div3 分层图 树形dp

思路:首先注意到这个图只有n - 1条边,并且是连通的,也就是说这是一棵树。如果这是多个连续的被保护的点,这里以两个点为例,对答案的贡献就是gold - c - c其中一个c表示本身被相邻的点抢走的gold,另一个c表示相邻那个点被这个点抢走的gold。思路:分层图,第一层图的边权为均为w,第二层图的边权均为w / 2,第一层图的点i与第二层图的点i + n对应,由于骑上马之后一定比骑上马再下马更优,因此两层图之间用单向边连接,即,如果在点i上有马,那么就在i与i + n之间连一条边权为0的单向边。

2201_75845839的博客 796

搞定最强大模型Gemini学生订阅,白嫖一年,包教包会

白嫖现在最强大模型

BUG猿的博客 2万+

File Load Error for Untitled.ipynb Unhandled error 解决方案

本文主要介绍了File Load Error for Untitled.ipynb Unhandled error 解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

Codeforces Round 974 (Div. 3) D,H,G

给定m个区间,q个查询,每次给出一个区间,求给定区间和m个区间的交集个数。分层图,对于这种同时出发相遇求最小时间的跑两边最短路,然后枚举相遇点即可。使用前缀和预处理,记录以左端点开头的和以右端点结尾的区间个数即可。本质上是求区间内数的出现次数是否均为偶数次,莫队即可。

Unlimitedz的博客 448

基于 Qt C++ 的 船舶导航系统 UI

你想实现一个基于 **Qt C++** 的 **船舶导航系统 UI**,核心功能包括 **Qt Quick** 电子海图显示和 **NMEA 0183** 协议解析。"断开" : "连接"创建一个 Qt Quick 项目,选择 **Qt 6** 版本,确保勾选 **Qt Quick**、**Qt Network** 和 **Qt SQL** 模块。Label { text: "纬度:" }3. **连接设备**:点击 "连接" 按钮连接到 GPS 设备或模拟数据源。title: "连接设置"

寒寒豆豆软件公司的博客 127

E. Rendez-vous de Marian et Robin

分层图图论

2302_81761369的博客 659

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

这篇文章教你如何对接金蝶API并且使用JAVA调用金蝶云星空的即时库存查询API

实用的博客 2608

手把手教你学Simulink--使用Simulink进行双冗余电机驱动系统的故障切换验证

提高系统可靠性:当一个电机或其驱动器出现故障时,另一个可以立即接管,避免系统停机。增强安全性:对于一些关键任务的应用场景(如飞行控制),确保即使在硬件故障情况下也能维持基本操作能力。简化维护:允许在不影响系统正常工作的情况下进行维护和更换故障部件。确定可能发生的故障类型(如过流、欠压、温度过高),以及每种故障对应的条件。通过上述步骤,我们简要介绍了如何基于Simulink实现双冗余电机驱动系统的故障切换验证。

MHD0815的博客 438

【补题】Codeforces Round 974 (Div. 3) E. Rendez-vous de Marian et Robin

不可能多源dij,类似于给所有有马点连接一个新的源点,将多源异化成单源就可以了,同时他们可以合并进一次操作中,如果还是不太清楚,可以自行查询一下多源bfs当单源的操作,方便理解但是是一样的实现想法。题意:给个图,两个人分别从点1和点n出发,问最早在哪个点可以相遇,其中某些点有马,骑上去之后可以在接下来剩余的时间内都可以将路程所需时间缩短一半。但是你可以这么想,类似形成一个分层图,骑上马后要对最短路重新规划,可能往回走,但是这样的点也有多个,是多源的,关于题目数据见原题,这里说明太累了。

2401_87294509的博客 454

手把手教你学simulink实例--Simulink在电动汽车故障诊断与预测中的应用仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车故障诊断与预测仿真。该系统能够全面评估故障诊断与预测算法的性能,验证其在不同故障场景下的有效性,并通过优化设计提高系统的可靠性和安全性。引入智能算法:结合人工智能技术,实现更智能的故障诊断与预测。扩展功能:增加对多种车型和故障类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

MHD0815的博客 256

Rendez-vous de Marian et Robin(Round 974)

【代码】Rendez-vous de Marian et Robin(Round 974)

GordrnGhost的博客 644

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 197

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 307

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 567

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 748

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 170

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 82

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 207

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 177

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 326

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 151
上一篇: D. Robert Hood and Mrs Hood题解
下一篇: 一个各种常用但是容易忘记的模版的文章(持续更新)
ResCells
博客等级 码龄4年 191粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值