洛谷P3403跳楼机(最短路构造/同余最短路)
解题思路:
最短路构造很神啊。
先用前两个值跑在第三个值模意义下的同余最短路(这步贪心可以证明,如果第三步长为z,那么如果n+z可以达到,n+2z同样可以达到)
最后计算与楼顶差多少个模计算一下就好了(细节:不要忘了自己也是一个解)。
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
struct pnt{
int hd;
lnt dis;
int no;
bool vis;
bool friend operator < (pnt x,pnt y)
{
return x.dis>y.dis;
}
}p[];
/*class heap{
public:
void push(pnt x)
{
ln[++siz]=x;
int nw=siz;
while((nw>>1)>=1)
{
int nx=nw>>1;
if(ln[nx].dis<=ln[nw].dis)
break;
std::swap(ln[nx],ln[nw]);
nw=nx;
}
return ;
}
void pop(void)
{
ln[1]=ln[siz--];
int nw=1;
while((nw<<1)<=siz)
{
int nx=nw<<1;
if(ln[nx+1].dis<ln[nx].dis&&nx<siz)
nx++;
if(ln[nx].dis>=ln[nw].dis)
break;
std::swap(ln[nx],ln[nw]);
nw=nx;
}
return ;
}
int top(void)
{
return ln[1].no;
}
bool empty(void)
{
return (siz==0);
}
private:
pnt ln[1000000];
int siz;
}Q;*/
std::priority_queue<pnt>Q;
struct ent{
int twd;
int lst;
lnt vls;
}e[];
lnt H;
int x,y,z;
int cnt;
lnt ans;
void ade(int f,int t,lnt v)
{
cnt++;
e[cnt].twd=t;
e[cnt].lst=p[f].hd;
e[cnt].vls=v;
p[f].hd=cnt;
return ;
}
void Init(void)
{
for(int i=;i<=z;i++)
{
p[i].no=i;
p[i].dis=0x3f3f3f3f3f3f3f3fll;
}
p[%z].dis=;
return ;
}
void Dij(void)
{
Q.push(p[%z]);
while(!Q.empty())
{
int x=Q.top().no;
Q.pop();
if(p[x].vis)
continue;
p[x].vis=true;
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].dis>p[x].dis+e[i].vls)
{
p[to].dis=p[x].dis+e[i].vls;
Q.push(p[to]);
}
}
}
return ;
}
int main()
{
scanf("%lld%d%d%d",&H,&x,&y,&z);
Init();
for(int i=;i<z;i++)
{
ade(i,(i+x)%z,x);
ade(i,(i+y)%z,y);
}
Dij();
for(int i=;i<z;i++)
if(p[i].dis<=H)
ans+=((H-p[i].dis)/z+);
printf("%lld\n",ans);
return ;
}
洛谷P3403跳楼机(最短路构造/同余最短路)的更多相关文章
- 【同余最短路】【例题集合】洛谷P3403 跳楼机/P2371 墨墨的等式
接触到的新内容,[同余最短路]. 代码很好写,但思路不好理解. 同余最短路,并不是用同余来跑最短路,而是通过同余来构造某些状态,从而达到优化时间空间复杂度的目的.往往这些状态就是最短路中的点,可以类比 ...
- [洛谷P3403] 跳楼机
题目传送门 套路题,同余最短路. 先只考虑y.z进行连边,再在mod x的意义下进行计算. 这里的“距离”dis[i]指的是,在所有满足a mod x=i的a里,能到达的最小的a是多少. 显然只要能到 ...
- BZOJ2118: 墨墨的等式(最短路构造/同余最短路)
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- luogu P3403 跳楼机 同余最短路
LINK:跳楼机 很早之前就想学的一个东西.发现这个东西果然神奇. 我们要找到 所有的 w满足 \(w=1+ax+by+cz\).且 \(1\leq w\leq h\) 暴力枚举是不行的. 做法是这样 ...
- 洛谷 P5663 加工零件 & [NOIP2019普及组] (奇偶最短路)
传送门 解题思路 很容易想到用最短路来解决这一道问题(题解法),因为两个点之间可以互相无限走,所以如果到某个点的最短路是x,那么x+2,x+4也一定能够达到. 但是如何保证这是正确的呢?比如说到某个点 ...
- 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞
题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...
- P3403 跳楼机
题解: 据说是最短路经典题 考虑mod c一意义下 我们会发现mod c相同的话我们一定会用最少步数到达,剩余的都用c转移 由于转移图有环所以我们用spfa来dp(其实也可以理解成最短路) wa了好多 ...
- 洛谷P3557 GRA-Tower Defense Game [POI2013] 构造
正解:构造 解题报告: 传送门 话说这题我理解题意理解了好久TT一直没懂那个,k的意义是什么,,,后来才明白,可能k就是没有意义的趴 (upd:好像明白辣,k是用来保证这么做是对的QwQ 然后就直接港 ...
随机推荐
- JAVA 不同类载入器命名空间的理解
曾经一直有这样一个疑惑: 都说在JAVA中,由不同类载入器载入的类在虚拟机中位于不同的命名空间下,不同命名空间下的类相互不可见. 这让我产生了一个迷惑:假设有一个类A使用了ja ...
- DispatcherServlet 前置控制器
1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容 ...
- P3507 [POI2010]GRA-The Minima Game
题目描述 Alice and Bob learned the minima game, which they like very much, recently. The rules of the ga ...
- IDEA设置注释模板最佳实践
效果 在方法上输入/**,然后按tab键,生成的效果如下 配置步骤 1. 在Live Templates中添加模板组,命名随意,主要是为了存放自定义的模板,方便管理 2. 在模板组下添加一个模板,具体 ...
- qt qlineedit只输入数字
lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));
- 关于app.FragmentManager和v4包的FragmentPagerAdapter冲突
这几天发现一个问题我用getFragmentManager()得到FragmentManager不能放到FragmentPagerAdapter里面去.由于FragmentPagerAdapter里面 ...
- 31.Intellij idea 的maven项目如何通过maven自动下载jar包
转自:https://blog.csdn.net/u012851114/article/details/81872981 maven项目自动加载jar包 所需工具如下: Intellij IDEA 1 ...
- 洛谷P2818 天使的起誓
题目描述 Tenshi非常幸运地被选为掌管智慧之匙的天使.在正式任职之前,她必须和其他新当选的天使一样要宣誓.宣誓仪式是每位天使各自表述自己的使命,他们的发言稿放在n个呈圆形排列的宝盒中.这些宝盒按顺 ...
- Whitening
The goal of whitening is to make the input less redundant; more formally, our desiderata are that ou ...
- C# 开发 —— 数组类对象接口
数组类型是从抽象基类 Array 派生的引用类型,通过new运算符创建数组并将数组元素初始化为他们的默认值 一维数组 type[] arrayname; 数组的长度不是声明的一部分,而且数组必须在访问 ...