I. Intersections

I. Intersections

题意:

n行,m列,n * m个交点,当我们处于交点(i,j),
如果当前时间位于[k * aij + k * bij , (k+1) * aij + k * bij ),我们可以上下移动
如果当前处于[(k+1)* aij + k * bij , (k+1) * aij + (k+1) * bij ],我们可以左右移动
也可以选择不动
cij表示从(i,j)移动到(i,j+1)的时间
wij表示从(i,j)移动到(i+1,j)的时间
问从(xs,ys)到(xt,yt)的最少时间是多少?

题解:

这个题肯定是最短路方向,但是和一般最短路不一样,因为你的方向选择受时间的限制,其实也不难,但是思维不要被限制,要放开想
我们先从时间下手,这两个时间区间合在一起就是[k * aij + k * bij, (k+1) * aij + (k+1) * bij ],一个周期就是(aij+bij),那么也就可以这样理解,给一个时间tim,x = tim%(aij+bij),如果x小于aij,说明当前时间就位于第一区间,如果大于等于aij,(也就是到达bij的区域)就在第二区间
tim的求法
ll tim = now.z % (a[x][y] + b[x][y]);
现在我们开始考虑路径
f[i][j]到点i,j的最短时间
如果我们要从(x,y)移动到(x-1,y),怎么行动?首先花费是固定的w[i-1][j],关键是什么时间段移动,
如果当前时间在第一时间段,在这个区间里,我们是可以上下移动的,也就是可以立刻行动,所以就是直接求最短路f[x - 1][y] = f[x][y] + w[x - 1][y];
如何当前时间在第二时间段,我们只能左右移动,根本不能到达上面,那怎么办,这个情况放弃?错了,这个时间段不能向上移动,但是我们说了(aij+bij)是一个周期,所以我们完全可以等到下一个周期的第一个时间段再向上移动,等待时间(即原地不动)
ll Tim = a[x][y] + b[x][y] - tim;//这是纯等待时间
f[x - 1][y] = f[x][y] + w[x - 1][y] + Tim;
也就是第一种情况的基础上算上等待时间
这是向上走的情况,还有向下,左,右三种情况,一次列出即可,用dij跑最短路就OK了
这样一看题目简单多了

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;typedef long long ll;
const int maxn = 505;
ll a[maxn][maxn],b[maxn][maxn],c[maxn][maxn],w[maxn][maxn];
ll f[maxn][maxn];
int vis[maxn][maxn];int n,m,sx,sy,ex,ey;struct Node {int x,y;ll z;bool operator < (const Node&rhs) const {return z > rhs.z;}
};void dij(int sx,int sy) {priority_queue<Node>q;q.push({sx,sy,0});f[sx][sy] = 0;while(!q.empty()) {Node now = q.top();q.pop();int x = now.x;int y = now.y;if(vis[x][y]) continue;vis[x][y] = 1;ll tim = now.z % (a[x][y] + b[x][y]);if(x > 1) { //往上走if(tim < a[x][y]) {//可以上下移动 if(f[x - 1][y] > f[x][y] + w[x - 1][y]) {f[x - 1][y] = f[x][y] + w[x - 1][y];q.push({x - 1,y,f[x - 1][y]});}} else {//只能左右移动,如果想往上走需要再等Tim这段时间 ll Tim = a[x][y] + b[x][y] - tim;if(f[x - 1][y] > f[x][y] + w[x - 1][y] + Tim) {f[x - 1][y] = f[x][y] + w[x - 1][y] + Tim;q.push({x - 1,y,f[x - 1][y]});}}}//下面同理与上 if(x < n) { //往下走if(tim < a[x][y]) {if(f[x + 1][y] > f[x][y] + w[x][y]) {f[x + 1][y] = f[x][y] + w[x][y];q.push({x + 1,y,f[x + 1][y]});}} else {ll Tim = a[x][y] + b[x][y] - tim;if(f[x + 1][y] > f[x][y] + w[x][y] + Tim) {f[x + 1][y] = f[x][y] + w[x][y] + Tim;q.push({x + 1,y,f[x + 1][y]});}}}if(y > 1) { //往左走if(tim < a[x][y]) {ll Tim = a[x][y] - tim;if(f[x][y - 1] >= f[x][y] + c[x][y - 1] + Tim) {f[x][y - 1] = f[x][y] + c[x][y - 1] + Tim;q.push({x,y - 1,f[x][y - 1]});}} else {if(f[x][y - 1] > f[x][y] + c[x][y - 1]) {f[x][y - 1] = f[x][y] + c[x][y - 1];q.push({x,y - 1,f[x][y - 1]});}}}if(y < m) { //往右走if(tim < a[x][y]) {ll Tim = a[x][y] - tim;if(f[x][y + 1] >= f[x][y] + c[x][y] + Tim) {f[x][y + 1] = f[x][y] + c[x][y] + Tim;q.push({x,y + 1,f[x][y + 1]});}} else {if(f[x][y + 1] > f[x][y] + c[x][y]) {f[x][y + 1] = f[x][y] + c[x][y];q.push({x,y + 1,f[x][y + 1]});}}}}
}int main() {scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&ex,&ey);for(int i = 1;i <= n;i++) {for(int j = 1;j <= m;j++) {scanf("%lld",&a[i][j]);}}for(int i = 1;i <= n;i++) {for(int j = 1;j <= m;j++) {scanf("%lld",&b[i][j]);}}for(int i = 1;i <= n;i++) {for(int j = 1;j <= m - 1;j++) {scanf("%lld",&c[i][j]);}}for(int i = 1;i <= n - 1;i++) {for(int j = 1;j <= m;j++) {scanf("%lld",&w[i][j]);}}memset(f,0x3f,sizeof(f));dij(sx,sy);printf("%lld\n",f[ex][ey]);return 0;
}

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

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

相关文章

[HNOI2013]消毒 (匈牙利最大匹配)

Description 最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故&#xff0c;他的分格实验皿是一个长方体,其尺寸为abc&#xff0c;a、b、c 均为正整数。为了实验的方便&#xff0c;它被划分为abc个单位立方体区域&#xff0c;每个单位立方体尺寸为111。用(i,…

YbtOJ-变量观测【鸽笼原理】

正题 题目大意 有nnn个数字开始都是000&#xff0c;要求有qqq次操作。 新建一个观测员&#xff0c;观测其中的kkk个数&#xff0c;当这kkk个数从此刻开始变化量不小于ttt时观测结束。将第iii个数加vvv&#xff0c;并输出此时观测结束的观测员编号。 强制在线 1≤n,q≤2105,1…

11.4模拟:总结

解析 110pts 7010300 写三题&#xff0c;挂三题 qwq T1在不同段之间的衔接处犯了个很脑残的错误 T2双向链表l[i]i-1活活写成了l[i]0 结果还能过样例 T3我两个复制的东西改完上面的没改下面的 。。。 qwq 本次做前两题做的有些太快了 样例过了就直接跳了 结果全部挂掉 以后…

.NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

前言 最近一直在忙公司和私下的兼职&#xff0c;白天十个小时&#xff0c;晚上四个小时&#xff0c;感觉每天都是打了鸡血似的&#xff0c;精神满满的&#xff0c;连自己那已经学打酱油的娃都很少关心&#xff0c;也有很长一段时间没有更新博客了&#xff0c;特别抱歉&#…

gym 102875A -- Array(未更新完)

gym 102875A – Array 题意&#xff1a; 对于一个数组a&#xff0c;以及数p&#xff0c; q个操作 1.对于区间[l,r]&#xff0c;里面所有数k 2.对于区间[l,r]&#xff0c;里面所有数 * k 3.对于区间[l,r]&#xff0c;里面所有数变成k次幂 4.对于区间[l,r]&#xff0c;输出里面…

[NOI2009] 变换序列 (匈牙利最大匹配)

description … solution 我竟然一眼题&#xff01;&#xff01; 变换后的TTT数组是[0,n)[0,n)[0,n)的排列&#xff0c;变换规则也有&#xff0c;距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个最大匹配&#xff1f;&#xff1f; 无解就是匹配数量达不到nnn罢了…

YbtOJ-方格填写【插头dp】

正题 题目大意 给出nmn\times mnm的网格填着−1∼4-1\sim 4−1∼4的数字&#xff0c;对于将所有的−1-1−1填上0∼40\sim 40∼4的方案中&#xff0c;定义方案XXX的权值&#xff0c;设在相邻网格之间连线&#xff08;每对只能连一条&#xff09;使得每个网格连出去的边数恰好位…

洛谷P3607:Subsequence Reversal P(区间dp)

解析 很巧妙的题 我一开始的dp设计其实是可以的 只是我误认为它的转移需要n^2 然后尝试把它压掉一维结果越跑越远… 但一个技巧是只从相邻的状态转移 使转移变成O1 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N52; const int M…

使用 WeihanLi.Npoi 操作 CSV

Intro最近发现 csv 文件在很多情况下都在使用&#xff0c;而且经过大致了解&#xff0c;csv 格式简单&#xff0c;相比 excel 文件要小很多&#xff0c;读取也很是方便&#xff0c;而且也很通用&#xff0c;微软的 ml.net 的示例项目 用来训练模型的数据也是使用的 csv 来保存的…

种类问题

几乎所有种类问题都可以转化成两种模型之一 1.直接维护ans数组 2.统计二维数点问题 前置知识 二维静态数点 以y为第一元素&#xff0c;x为第二元素&#xff0c;原点优先级大于查询点&#xff0c;对所有点&#xff08;原点查询点&#xff09;&#xff0c;然后求 for(int i1;…

「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)

description 研究者们想要测试 Misaka Network&#xff0c;于是他们把 Misaka Network 中的所有妹妹们召集到了一起。 现在妹妹们排成了 N行 M 列&#xff0c;有的位置没有人。现在研究者们给每一个个体的超能力进行了评定&#xff0c;一共有三个能力等级&#xff1a;Level 1 …

YbtOJ-相似子串【SA,RMQ,二分】

正题 题目大意 给出一个长度为nnn的字符串&#xff0c;两个串相似当且仅当可以通过每种字符置换使得它们相同。 qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r​子串有多少个相似的。 1≤n≤105,1≤q≤51051\leq n\leq 10^5,1\leq q\leq 5\times 10^51≤n≤105,1≤…

CF1313D:Happy New Year(状压dp)

解析 比较妙的一道题 首先的一个技巧是把一条线段拆成左和右两个端点 顺便也就有了离散化 利用k的关键限制&#xff0c;压缩每个点覆盖线段的状态 需要动态更新每一位所对应的线段是哪条 代码 #include<bits/stdc.h> using namespace std; #define ll long long cons…

程序员修仙之路--把用户访问记录优化到极致

点击上方蓝色字体&#xff0c;关注我们菜菜呀&#xff0c;前几天做的用户空间&#xff0c;用户反映有时候比较慢呀CEO,CTO,CFO于一身的CXO是吗&#xff1f;菜菜我把你拉进用户反馈群&#xff0c;你解决一下呀CEO,CTO,CFO于一身的CXO&#xff08;完了&#xff0c;以后没清净时候…

Codeforces Round #713 (Div. 3)

Codeforces Round #713 (Div. 3) 题号题目考点ASpy Detected!签到题BAlmost Rectangle模拟题CA-B Palindrome构造DCorrupted Array构造EPermutation by Sum构造FEducation模拟暴力GShort Task筛法求因数和文章目录A题意&#xff1a;题解&#xff1a;代码&#xff1a;B题意&…

[国家集训队]航班安排 (最大费用最大流)

description 神犇航空有K架飞机&#xff0c;为了简化问题&#xff0c;我们认为每架飞机都是相同的。神犇航空的世界中有N个机场&#xff0c;以0…N-1编号&#xff0c;其中0号为基地机场&#xff0c;每天0时刻起飞机才可以从该机场起飞&#xff0c;并不晚于T时刻回到该机场。一…

CF809D-Hitchhiking in the Baltic States【FhqTreap】

正题 题目链接:https://www.luogu.com.cn/problem/CF809D 正题 题目链接:https://www.luogu.com.cn/problem/CF809D 题目大意 有一个长度为nnn的序列aaa&#xff0c;要求ai∈[li,ri]a_i\in[l_i,r_i]ai​∈[li​,ri​]&#xff0c;要求使得aaa的最长严格上升子序列最长。 1≤…

Divide by Zero 2021 and Codeforces Round #714 (Div. 2)

Divide by Zero 2021 and Codeforces Round #714 (Div. 2) 题号题目知识点AArray and PeaksBAND SequencesCAdd OneDGCD and MSTECost EquilibriumFSwapping Problem

新数据革命:开源图形化数据引擎Hawk5发布

Hawk是一款开源图形化的爬虫和数据清洗工具&#xff0c;GitHub Star超过2k&#xff0c;前几代版本介绍如下&#xff1a;Hawk3: 终于等到你: 图形化开源爬虫Hawk 3发布!Hawk2: 120项优化: 超级爬虫Hawk 2.0重磅发布&#xff01;Hawk1: 如何从互联网采集海量数据&#xff1f;租房…

11.6模拟:总结

250pts 1003010020 好的地方是没有挂分吧 T4还用假复杂度过了20 但是T2其实是可做的 关键就是对模型的转化 换个角度考虑每条边的贡献 思路就豁然开朗了 T4确实是神仙题 不太可做 qwq 加油吧OvO