【图论】同余最短路
省选模拟赛 T3 一小部分用到了同余最短路,发现这简单东西自己从来没学过,补一下。
可以完全背包,但复杂度
发现如果
假设现在我们知道
这样点数为 dij
的话时间复杂度
但是其实最短路是不必要的,对于一个数
这样枚举
可以选择最小的数作为
P3403 跳楼机 板子。
memset(dis,63,sizeof(dis));
for(int i=0;i<x;++i)
add(i,(i+y)%x,y),add(i,(i+z)%x,z);
q.push({1,1%x});dis[1%x]=1;
while(!q.empty())
{
int x=q.top().second;q.pop();
if(vis[x]) continue;vis[x]=true;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(dis[y]>dis[x]+val[i])
dis[y]=dis[x]+val[i],q.push({dis[y],y});
}
}
for(int i=0;i<x;++i)
if(dis[i]<=h) ans+=(h-dis[i])/x+1;
memset(dis,63,sizeof(dis));dis[1%x]=1;
for(int i=0,lim=__gcd(y,x);i<lim;++i)
{
for(int cnt=0,p=i;cnt<2;cnt+=p==i)
{
int q=(p+y)%x;
dis[q]=min(dis[q],dis[p]+y);p=q;
}
}
for(int i=0,lim=__gcd(z,x);i<lim;++i)
{
for(int cnt=0,p=i;cnt<2;cnt+=p==i)
{
int q=(p+z)%x;
dis[q]=min(dis[q],dis[p]+z);p=q;
}
}
for(int i=0;i<x;++i)
if(dis[i]<=h) ans+=(h-dis[i])/x+1;
P8060 [POI2003] Sums 也是板子。
P2371 [国家集训队] 墨墨的等式 仍是板子。
P2662 牛场围栏 还是板子。
答案是
贪心加同余最短路。特殊的数据范围保证了
不太常规,记
人类智慧转化一下。推个式子,然后根号分治。根号分治里一半是简单同余最短路。
我就是为了这碗醋才包的这顿饺子。但是我懒得写这题题解了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」