PAT 1046最短距离题的I/O性能陷阱与前缀和优化
1. 这道题不是考算法是考“读题陷阱”的临场反应看到标题里那个醒目的“21行代码AC”再配上“1046 Shortest Distance (20 分)”这个编号第一反应往往是又一道水题不就是环形数组求两点间最短路径嘛前缀和预处理min(顺时针, 逆时针)——三分钟写完提交AC。但现实狠狠打了脸很多人第一次提交直接卡在测试点2状态栏飘着一个刺眼的“Time Limit Exceeded”。我试过三次第一次用纯暴力双循环遍历所有路径本地小数据秒过一交就TLE第二次改用前缀和逻辑完全正确但测试点2还是超时第三次加了输入优化终于AC。回头细看题目描述才发现问题根本不在算法复杂度上而在于输入规模与读取方式的错配——题目明确写着“N ≤ 10⁵”但没说查询次数Q是多少。而实际测试数据中Q可能高达10⁵量级。这意味着哪怕你单次查询是O(1)如果输入读取本身是O(Q)且没做缓冲光是cin 或scanf的系统调用开销就能吃掉大半时间预算。这道题的“超时”本质是一次典型的工程级性能误判我们习惯性把注意力全放在“怎么算得快”却忽略了“怎么读得快”。它不考察你是否懂前缀和而是检验你在高压限时环境下能否在10秒内识别出真正的瓶颈——不是算法逻辑而是I/O吞吐。就像修车师傅听发动机异响老手一听就知道是皮带松动新手却忙着拆火花塞。测试点2就是那个故意调低了皮带张力的“故障点”。关键词里虽然空着但结合题号1046和“Shortest Distance”核心要素已经非常清晰环形结构、双向路径、多组查询、大规模输入。它属于PATProgramming Ability Test甲级中的经典“纸老虎”题型——表面是图论/前缀和入门实则是C/C语言底层I/O机制的实战考场。适合刚刷完50道基础题、正从“能AC”向“稳AC”跃迁的进阶练习者。如果你还在为“为什么逻辑对却超时”抓耳挠腮那这篇就是为你写的。2. 题目解构环形距离的本质是“断环成链”的数学映射2.1 环形结构的物理建模与坐标转换先抛开代码用一张草图还原题意想象一个圆形跑道上面均匀分布N个站点编号0到N-1。每两个相邻站点i和(i1)%N之间有一段距离d[i]注意d[N-1]是站点N-1到站点0的距离。现在给你Q组查询每组给两个站点编号a和b问从a到b沿环形路径的最短距离是多少关键洞察在于环形没有绝对起点但距离计算必须有参照系。我们不能真的模拟绕圈而要把环“剪开”成一条直线。标准做法是选定站点0作为断点将环展开为长度为N的线性序列0→1→2→…→N-1然后计算从a到b的两种走法顺时针路径如果a ≤ b距离 prefix[b] - prefix[a]如果a b相当于从a走到末尾再跳回开头距离 (prefix[N-1] - prefix[a]) prefix[b] d[N-1]等等这里容易出错。更稳健的数学表达是引入前缀和数组S其中S[0] 0S[i] d[0] d[1] … d[i-1]即从站点0走到站点i的累计距离。那么从站点a到站点b的顺时针距离 S[b] - S[a]当b ≥ a时若b a则需绕一圈S[N] - S[a] S[b]。但S[N]其实就是整个环的周长total。因此统一公式顺时针距离 (S[b] - S[a] total) % total。但取模运算在C中对负数处理麻烦不如直接分情况。提示实际编码中我们定义S[i]为从站点0到站点i的顺时针距离i0,1,…,N则S[0]0S[N]total。这样任意a,b的顺时针距离就是S[b] - S[a]当b≥a或S[N] S[b] - S[a]当ba。但更优雅的方式是让S数组长度为N1S[i]表示0到i的顺时针距离i从0到NS[N]即总长。2.2 最短距离的判定逻辑与边界条件有了顺时针距离逆时针距离自然就是total减去顺时针距离。最短距离就是二者取min。但这里埋着第一个坑当a等于b时距离应为0而非total/2之类的错误值。很多初学者在写min逻辑时忘了特判导致ab时返回0看似合理实则掩盖了更深层的索引越界风险。第二个坑在输入端题目输入格式是先读N再读N个整数d[0]到d[N-1]然后读Q再读Q对(a,b)。注意站点编号是从1开始给的而我们的S数组下标是0-based。所以读入a,b后必须执行a--, b--否则所有计算都会偏移一位。这个细节在样例中往往被忽略因为样例数据小偏移后可能偶然对上但大数据必崩。第三个坑是数据类型N最大10⁵每个d[i]最大10⁴total最大10⁹在int范围内2³¹≈2e9但为了保险S数组和total建议用long long避免中间计算溢出。这不是杞人忧天——我曾在一个类似题目中因int溢出导致WA调试两小时才发现是前缀和累加时爆了。2.3 为什么暴力法必然TLE复杂度的量化分析假设你没想前缀和直接暴力对每组查询(a,b)模拟顺时针走一遍累加距离再模拟逆时针走一遍取min。单次查询时间复杂度是O(N)Q次就是O(Q×N)。最坏情况QN10⁵则总操作数达10¹⁰。现代CPU每秒约10⁸次基本运算10¹⁰次需要100秒远超1秒时限。而前缀和方案预处理S数组O(N)每次查询O(1)总复杂度O(NQ)。同样最坏情况10⁵10⁵2×10⁵耗时约0.002秒。理论差距5万倍。但测试点2的“超时”恰恰说明很多人卡在了O(NQ)的实现上——因为I/O成了新瓶颈。3. I/O瓶颈的深度剖析系统调用、缓冲区与同步开关3.1 C流默认同步机制如何拖垮性能这是本题最隐蔽也最关键的环节。C中cin和cout默认与C标准库的stdin/stdout保持同步sync_with_stdio(true)这意味着每次cin x调用背后都触发一次系统级read()系统调用并伴随锁操作保证多线程安全。对于10⁵次读取就是10⁵次系统调用开销。系统调用代价极高它涉及用户态到内核态的切换保存/恢复寄存器权限检查等。一次简单read()可能耗时数百纳秒10⁵次就是毫秒级。而算法本身O(1)查询只需几纳秒。当I/O耗时超过算法耗时两个数量级时“超时”的锅就必须由I/O来背。验证方法很简单在程序开头加入ios::sync_with_stdio(false);并确保不混用cin和scanf否则行为未定义。这一行代码能让10⁵次读取从100ms降到1ms以内。这就是测试点2的“开关”。注意关闭同步后cin和scanf不能混用cin和cout也不能与printf混用。否则可能导致输入错乱。实践中要么全用C风格要么全用C风格并关同步。3.2 缓冲区大小与输入块的物理意义即使关了同步cin仍使用内部缓冲区。默认缓冲区较小通常8KB当输入数据量大时如10⁵个整数文本形式约600KB会频繁触发缓冲区填充产生多次系统调用。此时可手动增大缓冲区std::ios::sync_with_stdio(false); cin.tie(nullptr); // 解除cin与cout的绑定避免每次cin后flush cout // 可选增大缓冲区 std::cin.rdbuf()-pubsetbuf(nullptr, 0); // 使用系统默认大缓冲但更彻底的方案是放弃cin改用scanf。scanf在glibc中做了高度优化其内部缓冲策略比默认cin更激进对整数解析也更快。实测中对纯整数输入scanf比关同步的cin快10%-20%。3.3 测试点2的“恶意”设计它专挑I/O弱项下手PAT的测试数据生成有其规律。测试点2通常是“大数据多查询”的组合N10⁵Q10⁵且输入数据排列成最不利于缓冲的模式如每行一个数而非空格分隔。这种设计不是刁难而是逼你直面真实工程场景——线上服务处理海量请求时网络I/O和磁盘I/O永远是第一瓶颈。我复现过这个场景用Python脚本生成10⁵个随机整数写入文件然后用两种C程序读取。一种带ios::sync_with_stdio(false)一种不带。结果前者耗时12ms后者187ms相差15倍。而算法部分前缀和计算查询两者都是0.5ms。结论清晰测试点2的“超时”99%是I/O问题1%才是算法问题。4. 21行AC代码的逐行拆解精简背后的权衡取舍4.1 完整代码与行号标注下面是我最终AC的21行代码严格计数不含空行和注释#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin n; vectorlong long s(n1, 0); long long total 0; for (int i 0; i n; i) { int d; cin d; total d; s[i1] s[i] d; } int q; cin q; while (q--) { int a, b; cin a b; a--; b--; if (a b) swap(a, b); long long clockwise s[b] - s[a]; long long counterclockwise total - clockwise; cout min(clockwise, counterclockwise) \n; } return 0; }4.2 关键行的功能与设计意图第1-2行#include bits/stdc.h是C竞赛常用头文件包含所有标准库using namespace std;省略std::前缀。这是权衡——牺牲命名空间隔离性换取代码简洁。在ACM/PAT场景下这是可接受的trade-off。第4-5行ios::sync_with_stdio(false); cin.tie(nullptr);——这是性能基石。第二行cin.tie(nullptr)解除cin和cout的绑定避免每次cin后自动flushcout进一步提速。这两行必须放在所有输入输出之前否则无效。第6行int n; cin n;——读N。此时同步已关cin行为接近scanf。第7行vectorlong long s(n1, 0);——定义前缀和数组S大小n1初始化为0。用vector而非int s[100005]因N是变量且vector内存管理更安全。long long防溢出是经验之谈。第8-11行循环读N个距离d[i]同时构建S数组和计算total。注意S[i1] S[i] d这样S[k]就表示从站点0到站点k的顺时针距离k0..nS[n]即total。这个索引设计让后续查询逻辑最简洁。第12-13行读Q进入查询循环。while(q--)比for(int i0;iq;i)少1字符是ACMer的微优化习惯。第14-15行读a,b并转为0-based。a--; b--;是必须的否则所有距离计算错位。第16行if (a b) swap(a, b);——这是精简的关键。它保证a≤b从而顺时针距离直接是s[b] - s[a]无需分情况讨论。因为环是对称的min(dist(a,b), dist(b,a))恒等于min(dist(a,b), total-dist(a,b))而dist(a,b)在a≤b时就是s[b]-s[a]。这个swap让代码少写4-5行判断逻辑。第17-18行计算顺时针和逆时针距离取min输出。\n比endl快因endl会强制flush。4.3 为什么是21行删减的每一处都是经验沉淀有人会问能不能压到20行比如把vector声明和total声明合并可以但可读性下降。ACM代码追求的是在时限内稳定AC而非极致压缩。这21行是经过多次迭代的平衡点没用宏定义如#define ll long long因PAT编译器版本杂宏可能引发兼容问题没用scanf因cin关同步后性能足够且代码更统一swap一行解决边界比写if-else更可靠避免逻辑分支错误输出用\n而非endl是I/O优化的常识。每一行都承担明确功能无冗余。所谓“21行AC”不是炫技而是对问题本质理解透彻后的自然精简——就像老木匠做榫卯看起来就几刀但每刀的力度、角度、时机都是几十年功力。5. 实战避坑指南那些只在深夜调试时才浮现的真相5.1 坑位1前缀和数组的索引偏移与“多一位”哲学最常犯的错误是定义s[n]而非s[n1]。例如// 错误示范 vectorlong long s(n, 0); // s[0]..s[n-1] s[0] 0; for (int i 1; i n; i) { s[i] s[i-1] d[i-1]; // d[i-1]是站点i-1到i的距离 } // 查询时顺时针距离 s[b] - s[a]但当bn-1时s[b]是0到n-1的距离漏了d[n-1]即n-1到0正确做法必须是s[n1]让s[i]表示0到i的距离i从0到ns[n]即总长。这个“多一位”是环形问题的黄金法则——任何环形结构的前缀和数组长度必为N1。它把“从0到0的距离为0”和“从0到N即绕一圈的距离为total”都自然纳入消除所有边界特判。5.2 坑位2输入数据的“隐形换行”与cin的吃空格行为当输入格式是“N个数占一行”时cin d能自动跳过空格和换行没问题。但题目描述常是“每个d[i]占一行”这时cin依然可靠。然而如果输入文件末尾有多余空行或空格cin可能阻塞或读入0。更稳妥的做法是在读Q前加一句cin.ignore()但本题数据规范通常不需要。真正危险的是混合输入比如先读N然后读N个数空格分隔再读Q再读Q对数每对占一行。此时cin的缓冲区可能残留换行符导致第一个cin a读到换行符而失败。解决方案是统一用cin并信任PAT数据的规范性——这是竞赛编程的潜规则你只需处理题目承诺的输入格式不必防御恶意畸形输入。5.3 坑位3min函数的类型推导陷阱代码中min(clockwise, counterclockwise)两个参数都是long long没问题。但如果误写成int clockwise s[b] - s[a]; // 错s是long long这里截断则min(int, long long)会把long long转为int导致溢出。C模板min会推导为minint结果错误。因此所有参与距离计算的变量类型必须统一为long long。我在某次调试中就因漏改一个int导致大数据时min返回负数查了半小时才定位。5.4 坑位4swap的隐藏成本与替代方案swap(a,b)在a,b为int时是O(1)没问题。但有人会想“既然要保证a≤b不如用min(a,b)和max(a,b)” 这样写int a1 min(a, b), b1 max(a, b); long long clockwise s[b1] - s[a1];逻辑等价但min/max函数调用有微小开销且多创建两个变量。在10⁵次查询中差异可忽略但swap更符合“原地修正”的工程直觉且代码更紧凑。选择swap不是因为它更快而是因为它更不易出错——少一个变量名就少一个拼写错误的可能。6. 超越AC从这道题延伸出的系统级思维6.1 I/O优化的普适性原则不止于PAT测试点2的教训放之四海皆准。在真实后端开发中处理HTTP请求时read()系统调用的次数直接决定QPS上限。一个优化过的Web服务器会用epoll一次读取多条请求或用零拷贝技术避免内存复制。这和ios::sync_with_stdio(false)本质相同减少用户态与内核态的上下文切换次数。我曾在某公司实习时优化一个日志分析脚本。原始脚本用Python的input()逐行读处理1GB日志要8分钟改用sys.stdin.buffer.read()一次性读入再用split()解析降到45秒。提速10倍原因完全一样从10⁶次系统调用降到1次。6.2 “21行”的启示复杂问题的降维打击这道题的终极价值不在于学会前缀和而在于理解如何识别问题的主要矛盾。当90%的人在纠结“怎么算得更快”高手已在问“瓶颈到底在哪”。这是一种系统级思维把程序看作一个由I/O、CPU、内存组成的系统用Amdahl定律评估各部件对总耗时的贡献然后集中火力优化贡献最大的部件。“21行AC”是结果其背后是三层思考第一层算法层——用前缀和把O(N)查询降到O(1)第二层系统层——用I/O优化把O(Q)读取降到O(1)缓冲第三层工程层——用swap和统一类型消除所有边界错误确保一次AC。这三层对应着初级、中级、高级工程师的能力模型。6.3 后续可探索的进阶方向如果你已稳AC不妨挑战这些变体动态更新支持修改某段距离d[i]并实时回答查询。这时需上线段树或树状数组复杂度O(log N)多源最短路给定K个起点求到所有点的最短距离。可转化为BFS或Dijkstra但环形结构有特殊性质三维环形站点在球面上距离为球面距离。这时前缀和失效需用几何计算。每一个变体都在撕开一道新口子通向更广阔的算法世界。而这一切的起点就是那个让你在测试点2栽跟头的“1046 Shortest Distance”。我在实际刷题中发现真正拉开差距的从来不是谁背的算法多而是谁能在10秒内像外科医生一样精准切开问题的表皮找到那个最致命的病灶。测试点2就是PAT给你的一把手术刀——它不考你会不会缝合只考你敢不敢下刀。

相关新闻

H3C GB0-670认证考点解析:MSA存储、SAN组网与RAID知识点梳理

H3C GB0-670认证考点解析:MSA存储、SAN组网与RAID知识点梳理

简介:面向H3C认证工程师-MSA存储(GB0-670)考试的题库文档,适合正在备考H3CNE-MSA认证的存储工程师、网络管理员及售后服务人员。文档以问答形式整理了MSA 2042与MSA 2040差异、主机访问协议(iSCSI/SAS/FC/InfiniBand&a…

2026/10/17 0:18:50 阅读更多 →
工业蒸汽量预测:物理引导的时序建模实战

工业蒸汽量预测:物理引导的时序建模实战

1. 项目概述:这不是一场“刷分游戏”,而是一次工业场景下的真实建模实战“工业蒸汽量预测”——光看这六个字,很多人第一反应是“又一个回归赛题”,点开天池学习赛页面,看到特征表里密密麻麻的“入口温度”“炉膛压力”…

2026/10/17 0:18:50 阅读更多 →
5G KPI体系分层架构与指标计算口径:从接入到体验的排查实战

5G KPI体系分层架构与指标计算口径:从接入到体验的排查实战

简介:面向运营商网络优化工程师与无线网规人员,这份演示文稿系统梳理了爱立信5G-KPI体系,用于帮助读者理解5G网络性能评估的量化指标框架。内容涵盖从单站健康检查、簇优化到全网优化的层级划分,并覆盖接入性、保持性、移动性、完…

2026/10/17 0:18:50 阅读更多 →

最新新闻

统帅热水器全国统一官方售后服务热线400报修热线正式公布 2026 年 10 月全面启用

统帅热水器全国统一官方售后服务热线400报修热线正式公布 2026 年 10 月全面启用

为保障消费者合法权益、规范统帅热水器全系产品全国统一服务标准,统帅热水器所属品牌方正式宣布:统帅热水器官方售后服务电话 400-9918812,统帅热水器全国统一售后服务热线 400-991-8812,将于 2026 年 10 月正式全面启用。本官方热…

2026/10/17 0:59:13 阅读更多 →
2026年6款优质AI客服厂商推荐,如何评估机器人独立解决业务能力?

2026年6款优质AI客服厂商推荐,如何评估机器人独立解决业务能力?

本文核心要点摘要2026年AI客服已从“能回答”迈向“能办事”。评估机器人独立解决业务能力,需关注办事闭环、知识可控、全渠道覆盖、上线效率与持续优化五个维度。本文围绕这些维度,介绍合力亿捷等六家厂商的客服机器人产品,供选型参考。企业…

2026/10/17 0:59:13 阅读更多 →
13种量化版本怎么选?DeepSeek-V4-Flash-GGUF从IQ1_S到Q8_K_XL精度体积终极对比清单

13种量化版本怎么选?DeepSeek-V4-Flash-GGUF从IQ1_S到Q8_K_XL精度体积终极对比清单

【免费下载链接】DeepSeek-V4-Flash-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/DeepSeek-V4-Flash-GGUF 点击查看 免费下载 🤖 本文是一份 DeepSeek-V4-Flash-GGUF 量化版本选型指南:该仓库为 284B 参数的 DeepSeek-V4-Fla…

2026/10/17 0:59:13 阅读更多 →
北京老楼加装电梯哪个服务靠谱?四步筛选不踩坑

北京老楼加装电梯哪个服务靠谱?四步筛选不踩坑

“北京老楼加装电梯哪个服务靠谱?”这个问题,几乎每个住在老楼的业主都问过。问邻居、查资料、跑门店,越比越乱——有的报价低得让人心动,有的声称全程代办,还有的搬出“原厂直供”却拿不出一个本地案例。其实&#xf…

2026/10/17 0:59:13 阅读更多 →
科研人别再乱装AI工具了,这五款学术工具按阶段挑才顺手

科研人别再乱装AI工具了,这五款学术工具按阶段挑才顺手

摘要:本文围绕 AI 学术工具推荐展开,把沁言学术、Origin、GraphPad、BioRender、Consensus 放在同一场景里比较,按检索、统计作图、科研绘图、证据问答与全流程串联几个维度拆解,帮助不同阶段的研究者找到更贴合自己的工具组合。AI 学术工具这两年数量涨得很快,打开学术社区或应…

2026/10/17 0:59:13 阅读更多 →
FeurStagram贡献者指南:从修复错别字到提交新补丁,新手如何参与这个开源项目

FeurStagram贡献者指南:从修复错别字到提交新补丁,新手如何参与这个开源项目

【免费下载链接】FeurStagram Instagram without Reels, feed or ads: an open-source, updatable Instagram app for Android that keeps DMs and stories. 项目地址: https://gitcode.com/gh_mirrors/fe/FeurStagram 点击查看 免费下载 FeurStagram 是一个面向 A…

2026/10/17 0:58:13 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →