当前位置: 首页 > news >正文

CF1860E Fast Travel Text Editor 题解

题目链接

我是奶龙,这种题目做不出来。

问题不妨转化成:

给定一个长度为 \(n\) 的序列,每个点有权值 \(a_i\),每次移动可以走到相邻节点或者同色节点,求从 \(s\)\(t\) 所需的最少时间

这个问题大抵是挺经典的。考虑建模成图论。显然的,可以对于相邻位置连一个大小为 1 的边,但是如果对于同色节点两两连边,边数可以来到 \(O(n^2)\),难以接受,因此对于每种颜色建立一个超级原点,使得节点连向超级原点所需的权值为1超级原点连向节点需要的权值为0

但是这样子直接建图跑还是会 TLE,继续优化。观察到这道题原点的个数很少,因此尝试使用原点进行搜索。但是一个节点是否会到原点,这便是这道题卡住我的地方。实际上,我们可以分类讨论。如果一个节点没有来到原点,那么肯定是直接走,否则必定要先到一个原点。可以枚举这个原点,时间复杂度是正确的。具体实现看代码。

Code

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define fi first
#define se second
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
const int N = 5e4 + 26 * 26 + 10,M = 26 * 26 + 10;
string s;
int n;
vector< pair<int,int> > G[N];
int f[M][N],g[M][N];//all,only
const int INF = 1e9 + 7;
int vis[N];
inline void getmin(int &a,int b){if(a > b) a = b;
}
inline void bfs1(int st){int fake = st - n;for(int i=0;i<=n+26*26;i++)g[fake][i] = INF;g[fake][st] = 0;for(pair<int,int> e : G[st]){g[fake][e.fi] = 0;}for(int i=1;i<=n;i++){getmin(g[fake][i],g[fake][i-1] + 1);}for(int i=n-1;i>=1;i--)getmin(g[fake][i],g[fake][i+1] + 1);
}
inline void bfs2(int st){int fake = st - n;deque<int> q;q.push_back(st);for(int i=1;i<=n+26*26;i++)f[fake][i] = INF;f[fake][st] = 0;while(!q.empty()){int u = q.front();q.pop_front();if(vis[u] == fake + 26 * 26) continue;vis[u] = fake + 26 * 26;for(pair<int,int> e : G[u]){int v = e.fi,w = e.se;if(f[fake][v] > f[fake][u] + w){f[fake][v] = f[fake][u] + w;if(w == 0) q.push_front(v);else q.push_back(v);}}}
}
int main()
{IOS;cin >> s;n = s.size();s = " " + s;for(int i=1;i<n;i++){if(i > 1) G[i].push_back({i-1,1});if(i < n - 1)G[i].push_back({i+1,1});int x = n + (s[i] - 'a') * 26 + (s[i+1] - 'a') + 1;G[x].push_back({i,0});G[i].push_back({x,1});}for(int i=n+1;i<=n+26*26;i++){bfs1(i);bfs2(i);}int Q;cin >> Q;while(Q -- ){int st,ed;cin >> st >> ed;int ans = abs(ed - st);for(int i=n+1;i<=n+26*26;i++)getmin(ans,g[i-n][st] + 1 + f[i-n][ed]);cout << ans << "\n";}return 0;
}

后记

赞美【数据删除】,在缩小原题时限的同时,不知道自己评测机跑的有多慢,卡常卡了半天,靠评测波动过去了。

http://www.jsqmd.com/news/572509/

相关文章:

  • SAP发票校验全流程解析:从MIRO操作到应付账款管理
  • 标题:兼顾通信、阅读与生产力:Bigmenbsp;53Hz彩墨屏手写手机预售已开启 - 资讯焦点
  • YOLOv5实战:自定义预测框与标签样式,打造个性化视觉检测结果
  • GLM-4.1V-9B-Base实战教程:适配国产算力环境的视觉理解部署方案
  • 兰亭妙微AI交互范式研究:从关键词搜索到意图理解的本地生活服务入口重构 - ui设计公司兰亭妙微
  • AI辅助开发进阶:让快马智能助手帮你设计与优化专业图像处理库
  • 超融合是什么?还在用传统 IT 架构?超融合私有云才是未来趋势
  • Python实战:5分钟搞定小波阈值去噪(附完整代码)
  • ANR-WatchDog源码深度剖析:从线程监控到错误抛出的完整实现
  • 基于libimobiledevice的免越狱iOS系统定制突破性方案
  • 重新定义网页内容捕获:MarkDownload颠覆式网页转Markdown解决方案
  • 为什么你的Polars 2.0清洗脚本在1TB数据下突然卡死?——Lazy Execution陷阱、Chunking边界与并发泄漏三重真相
  • C
  • Ubuntu20.04安装yum踩坑实录:从‘unable to locate package’到完美解决的全过程
  • 别再折腾虚拟机了!用Docker Desktop在Win10上5分钟搞定ClickHouse开发环境
  • 别急着刷固件!RealSense ROS收不到IMU数据?先试试这3个被我忽略的配置检查
  • ABB机器人Profinet通信实战:如何正确传输Real类型数据(附完整代码示例)
  • DeepSeek-Coder-V2-Lite-Instruct评估指标详解:代码准确率、效率与创新性
  • React新手必看:从零搭建你的第一个组件(附完整代码示例)
  • 用51单片机定时器做一个多功能秒表:代码详解如何整合数码管、按键与中断
  • Pwndbg调试效率提升与界面定制完全指南
  • 效率提升秘籍:使用快马AI一键生成动漫视频批量处理与格式转换工具
  • Go Context 超时控制的正确使用
  • 全志T113 G2D硬件加速实战:在Cdroid框架下实现UI图层高效Blit与FillRect
  • 终极指南:在Mac上轻松创建Windows启动盘的完整教程
  • intv_ai_mk11基础操作:Llama模型网页界面各控件功能与典型错误应对
  • 3大核心功能解放明日方舟玩家双手:MAA自动化助手全攻略
  • 告别GUI!在VS2017里用命令行+conf文件玩转RTKLIB 2.4.3 PPP数据处理
  • 手机号查QQ号:3分钟找回遗忘的QQ账号
  • 避坑指南:Windows系统下WampServer2.2e与MySQL5.5.24的完美兼容配置